Проверка нулевой последовательности перед конкатенацией

Этот вопрос похож на много вопросов, но ни в коем случае это не дубликат. Этот вопрос связан с конкатенацией строк и написанием лучшего кода меньше, чем для проверки nil/zero.

В настоящее время у меня есть:

file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)

Что отлично работает, но выглядит не очень хорошо. Что лучше писать в рубине, так что я проверяю нуль, а не конкатенирую его.

Ответы

Ответ 1

Вы можете сделать это:

file.puts "cn: " + (var1 || "UNKNOWN")

или, если вы предпочитаете:

file.puts "cn: " + (var1 or "UNKNOWN")

или мой любимый, который я считаю самым идиоматичным рубином:

file.puts "cn: #{var1 or 'unknown'}"

Ответ 2

Я бы сделал то, что предложил Питер, считая, что 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

Ответ 3

Используйте join, чтобы добавить строки, которые могут быть nil.

join не будет жаловаться, если есть nil

Например:

["a","b",nil,"c"].join("")

Вернет

abc

Ответ 4

file.puts( "cn:" + (var1 || "UNKNOWN" ))

Ответ 5

Поскольку часть "cn: " является чисто эстетичной и поэтому (более?) подвержена изменениям, чтобы соответствовать будущим правилам представления, я бы рекомендовал использовать join;

file.puts(["cn", (var1 || "UNKNOWN")].join(": ")

Возможно, как функция, как упоминалось ранее - семантика одна и та же, только имена или ключевые слова метода изменены;

def value_or_unknown(value, attribute = nil)
  [attribute, (value or "UNKNOWN")] * ": "
end

Ответ 6

Использование 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"