Этот вопрос подобен БОЛЬШОМУ КОЛИЧЕСТВУ вопросов, но никаким таким способом это что-либо дубликата. Этим вопросом являются о конкатенации строк и написании лучшего кода меньше, чем это для проверки ноля/нуля.
В настоящее время я имею:
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
Поскольку "cn: "
часть чисто эстетическая и поэтому (в большей степени?) может быть изменена в соответствии с будущими рекомендациями по представлению, я бы рекомендовал использовать join;
file.puts(["cn", (var1 || "UNKNOWN")].join(": ")
Возможно, как функцию, как упоминалось ранее - семантика та же, изменились только имена методов/ключевые слова;
def value_or_unknown(value, attribute = nil)
[attribute, (value or "UNKNOWN")] * ": "
end