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

问题描述 投票:3回答:4

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

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

换句话说,我正在寻找一种方法,结果是这样的:

> @hash = nil
> @hash.try(:["key"])
=> nil
ruby-on-rails ruby hash key
4个回答
6
投票

各种to_X方法通常是方便的方法,可以将nils静静地转换为您真正感兴趣的空实例,而无需使用显式条件复杂化您的逻辑。

在你的情况下,你可以利用Hash#to_h返回哈希本身和NilClass#to_h返回一个空哈希:

> hash = nil
> hash.to_h['key']
=> nil

> hash = { 'key' => 11 }
> hash.to_h['key']
=> 11

有时这比明确的if噪音小,有时它不是。


6
投票

您描述的情况(hash = nil)不是“缺少哈希键”,它根本不是哈希值。

除了其他答案,另一种方式可能是Ruby(2.3)

hash&.fetch("key", nil)

要么:

 (hash || {})["key"]

如果散列是nil或者它缺少密钥,这两个都将返回nil


3
投票

你可以在使用@hash之前检查nil是否是@hash["key"],如下所示:

@hash = nil
@hash["key"] unless @hash.nil?
#=> nil

1
投票

要使用try,你可以做到

@hash.try(:[], 'key')

甚至

@hash&.[]('key')

如果你在红宝石2.3+

© www.soinside.com 2019 - 2024. All rights reserved.