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