我有一个哈希,我正在寻找其中的某个键。但有时hash
本身可能是零。在这种情况下,我不希望hash["key"]
返回undefined method '[]' for nil:NilClass
错误。我想要它返回nil
而不是。
在其他类似的情况下,我可以使用try
,像这样:nil.try(:key) => nil
但我无法使用相同的方法来处理我的哈希。
换句话说,我正在寻找一种方法,结果是这样的:
> @hash = nil
> @hash.try(:["key"])
=> nil
各种to_X
方法通常是方便的方法,可以将nil
s静静地转换为您真正感兴趣的空实例,而无需使用显式条件复杂化您的逻辑。
在你的情况下,你可以利用Hash#to_h
返回哈希本身和NilClass#to_h
返回一个空哈希:
> hash = nil
> hash.to_h['key']
=> nil
> hash = { 'key' => 11 }
> hash.to_h['key']
=> 11
有时这比明确的if
噪音小,有时它不是。
您描述的情况(hash = nil
)不是“缺少哈希键”,它根本不是哈希值。
除了其他答案,另一种方式可能是Ruby(2.3)
hash&.fetch("key", nil)
要么:
(hash || {})["key"]
如果散列是nil
或者它缺少密钥,这两个都将返回nil
。
你可以在使用@hash
之前检查nil
是否是@hash["key"]
,如下所示:
@hash = nil
@hash["key"] unless @hash.nil?
#=> nil
要使用try,你可以做到
@hash.try(:[], 'key')
甚至
@hash&.[]('key')
如果你在红宝石2.3+