这个问题类似于很多问题,但不是这样的任何重复问题。这个问题是关于字符串连接和编写比检查nil / zero更好的代码。
目前我有:
file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)
哪种方法很好,但看起来不太好。什么是更好的方式在ruby中写这个,以便我检查nil而不是连接它
答案 0 :(得分:42)
你可以这样做:
file.puts "cn: " + (var1 || "UNKNOWN")
或者,如果您愿意,同样如下:
file.puts "cn: " + (var1 or "UNKNOWN")
或我最喜欢的,我认为这是最惯用的红宝石:
file.puts "cn: #{var1 or 'unknown'}"
答案 1 :(得分:8)
使用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
答案 2 :(得分:4)
我会做彼得建议的,假设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
不能保证为nil或字符串时,才需要 var1
。或者,如果你这样做:
file.puts "cn: #{display_value(var1)}"
它会对to_s
display_value
答案 3 :(得分:3)
使用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"
答案 4 :(得分:1)
file.puts( "cn:" + (var1 || "UNKNOWN" ))
答案 5 :(得分:1)
由于"cn: "
部分纯粹是审美的,因此(更多?)可能会有变化以符合未来的演示指南,我建议使用连接;
file.puts(["cn", (var1 || "UNKNOWN")].join(": ")
也许作为一个函数,如前所述 - 语义相同,只有方法名称/关键字发生了变化;
def value_or_unknown(value, attribute = nil)
[attribute, (value or "UNKNOWN")] * ": "
end