【发布时间】:2011-01-12 19:40:18
【问题描述】:
这个问题与很多问题相似,但绝不是重复的问题。这个问题是关于字符串连接和编写比检查零/零更好的代码。
目前我有:
file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)
效果很好,但看起来不太好。用 ruby 编写这个更好的方法是什么,以便我检查 nil 而不是连接它
【问题讨论】:
标签: ruby code-formatting
这个问题与很多问题相似,但绝不是重复的问题。这个问题是关于字符串连接和编写比检查零/零更好的代码。
目前我有:
file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1)
效果很好,但看起来不太好。用 ruby 编写这个更好的方法是什么,以便我检查 nil 而不是连接它
【问题讨论】:
标签: ruby code-formatting
你可以这样做:
file.puts "cn: " + (var1 || "UNKNOWN")
或者,如果您愿意,也一样:
file.puts "cn: " + (var1 or "UNKNOWN")
或我最喜欢的,我认为是最惯用的红宝石:
file.puts "cn: #{var1 or 'unknown'}"
【讨论】:
false,您会看到“未知”。
使用join 添加可能是nil 的字符串。
如果有nil,join 不会抱怨
例如:
["a","b",nil,"c"].join("")
#=> abc
但是,如果您使用除空白字符串(例如下划线)之外的任何字符串进行连接,您将获得 nil 值的连接字符串:
["a","b",nil,"c"].join("_")
#=> a_b__c
要解决此问题,请在加入前使用.compact 从Array 中删除nil 值:
["a","b",nil,"c"].compact.join("_")
#=> a_b_c
【讨论】:
["a","b",nil,"c"].compact.join("_") 解决问题
使用 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"
【讨论】:
假设false 不是var1 的有效值,并且var1 保证为nil 或字符串,我会按照Peter 的建议进行操作。您还可以将该逻辑提取到一个函数中:
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)}"
它将对display_value的结果执行隐式to_s
【讨论】:
file.puts( "cn:" + (var1 || "UNKNOWN" ))
【讨论】:
由于"cn: " 部分纯粹是为了美观,因此(更多?)可能会根据未来的演示指南进行更改,我建议使用join;
file.puts(["cn", (var1 || "UNKNOWN")].join(": ")
也许作为一个函数,如前所述——语义相同,只是方法名称/关键字发生了变化;
def value_or_unknown(value, attribute = nil)
[attribute, (value or "UNKNOWN")] * ": "
end
【讨论】: