Проверка на нулевую строку перед объединением - PullRequest
16 голосов
/ 04 февраля 2010

Этот вопрос похож на МНОГО вопросов, но ни в коем случае не является дубликатом. Этот вопрос касается конкатенации строк и написания лучшего кода, чем для проверки ноль / ноль.

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

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

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

Ответы [ 6 ]

42 голосов
/ 04 февраля 2010

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

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

или, если хотите, идентично:

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

или мой любимый, который, я думаю, самый идиоматичный рубин file.puts "cn: #{var1 or 'unknown'}"

8 голосов
/ 07 января 2015

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

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

Например:

["a","b",nil,"c"].join("") 
#=> abc

Однако, если вы присоединяетесь к чему-либо, кроме пустой строки, например, подчеркивания, вы получите строку соединения для значения nil:

["a","b",nil,"c"].join("_")
#=> a_b__c

Чтобы исправить это, используйте .compact, чтобы удалить значения nil из Array перед присоединением:

["a","b",nil,"c"].compact.join("_")
#=> a_b_c
4 голосов
/ 04 февраля 2010

Я бы сделал то, что предложил Питер, предполагая, что 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 не гарантированно равно nil или является строкой.В качестве альтернативы, если вы сделаете:

file.puts "cn: #{display_value(var1)}"

, это будет неявное to_s в результате display_value

3 голосов
/ 30 ноября 2017

При использовании 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" 
1 голос
/ 20 июня 2010

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

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

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

def value_or_unknown(value, attribute = nil)
  [attribute, (value or "UNKNOWN")] * ": "
end
1 голос
/ 04 февраля 2010
file.puts( "cn:" + (var1 || "UNKNOWN" ))
...