Ответ 1
Вы можете сделать это:
file.puts "cn: " + (var1 || "UNKNOWN")
или, если вы предпочитаете:
file.puts "cn: " + (var1 or "UNKNOWN")
или мой любимый, который я считаю самым идиоматичным рубином:
file.puts "cn: #{var1 or 'unknown'}"
Этот вопрос похож на много вопросов, но ни в коем случае это не дубликат. Этот вопрос связан с конкатенацией строк и написанием лучшего кода меньше, чем для проверки nil/zero.
В настоящее время у меня есть:
file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)
Что отлично работает, но выглядит не очень хорошо. Что лучше писать в рубине, так что я проверяю нуль, а не конкатенирую его.
Вы можете сделать это:
file.puts "cn: " + (var1 || "UNKNOWN")
или, если вы предпочитаете:
file.puts "cn: " + (var1 or "UNKNOWN")
или мой любимый, который я считаю самым идиоматичным рубином:
file.puts "cn: #{var1 or 'unknown'}"
Я бы сделал то, что предложил Питер, считая, что false
не является допустимым значением для var1
, а var1
гарантированно будет nil
или строка. Вы также можете извлечь эту логику в функцию:
def display_value(var)
(var || "UNKNOWN").to_s # or (var.nil? ? "UNKNOWN" : var.to_s) if 'false' is a valid value
end
file.puts "cn: " + display_value(var1)
to_s
требуется только в том случае, если var1
не гарантируется ниль или строка. Кроме того, если вы выполните:
file.puts "cn: #{display_value(var1)}"
он будет делать неявный to_s
результат display_value
Используйте join
, чтобы добавить строки, которые могут быть nil
.
join
не будет жаловаться, если есть nil
Например:
["a","b",nil,"c"].join("")
Вернет
abc
file.puts( "cn:" + (var1 || "UNKNOWN" ))
Поскольку часть "cn: "
является чисто эстетичной и поэтому (более?) подвержена изменениям, чтобы соответствовать будущим правилам представления, я бы рекомендовал использовать join;
file.puts(["cn", (var1 || "UNKNOWN")].join(": ")
Возможно, как функция, как упоминалось ранее - семантика одна и та же, только имена или ключевые слова метода изменены;
def value_or_unknown(value, attribute = nil)
[attribute, (value or "UNKNOWN")] * ": "
end
Использование ruby 2.4.1, to_s
разрешается как для nil
, так и для "Hello"
. Поэтому var1.to_s
должно быть достаточно.
2.4.1 :058 > nil.to_s
=> ""
2.4.1 :059 > "hello".to_s
=> "hello"