如何从缺少的哈希键返回nil而不是错误?

时间:2017-06-11 01:20:00

标签: ruby-on-rails ruby hash key

我有一个哈希,我正在寻找其中的某个键。但有时hash本身可能是零。在这种情况下,我不希望hash["key"]返回undefined method '[]' for nil:NilClass错误。我希望它返回nil

在其他类似的情况下,我可以使用try,如下所示:nil.try(:key) => nil但我无法使用相同的方法来处理哈希值。

换句话说,我正在寻找一种能产生类似结果的方法:

> @hash = nil
> @hash.try(:["key"])
=> nil

4 个答案:

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