在连接之前检查nil字符串

时间:2010-02-03 21:08:50

标签: ruby code-formatting

这个问题类似于很多问题,但不是这样的任何重复问题。这个问题是关于字符串连接和编写比检查nil / zero更好的代码。

目前我有:

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

哪种方法很好,但看起来不太好。什么是更好的方式在ruby中写这个,以便我检查nil而不是连接它

6 个答案:

答案 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

要解决此问题,请在加入之前使用.compactnil中删除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