零时替换,不是假的

时间:2014-09-25 21:08:31

标签: ruby

我想替换哈希'具有特定默认值的零值:

hash = { a: 'populated', b: false, c: nil }
hash.map { |k, v| v || 'REPLACED BECAUSE NIL' }
#=> expected: ["populated", false, "REPLACED BECAUSE NIL"]
#   got:      ["populated", "REPLACED BECAUSE NIL", "REPLACED BECAUSE NIL"]

然而,问题是,我不想覆盖虚假。我想保持虚假,只会覆盖零。

我可以在一行中完成吗?

2 个答案:

答案 0 :(得分:4)

您可以使用nil?方法。

hash = { a: 'populated', b: false, c: nil }
hash.map { |k, v| v.nil? ? 'REPLACED BECAUSE NIL' : v }
# => ["populated", false, "REPLACED BECAUSE NIL"]

如文档中所述,只有对象nil才会true回复nil?,因此您不会对假值有任何问题。

答案 1 :(得分:0)

您可以使用v == nil测试nil&n。 Hash类还支持hash = Hash.new('Something')的默认值:

hash = Hash.new 'llama'
hash[:blark]
#=> "llama"

或者你的方式

hash = { a: 'populated', b: false, c: nil }
hash.map { |k, v| v == nil ? 'REPLACED BECAUSE NIL' : v }