相当于Rails的安全导航尝试哈希

在Rails中,您可以执行hash.try(:[], :key) ,这有助于hash值可能nil 。 是否有使用新的Ruby 2.3安全导航操作符的等效版本&.[]

&. 并不等同于Rails的try ,但你可以使用&. 哈希。 只是使用它,没什么特别的。

 hash[:key1]&.[](:key2)&.[](:key3) 

虽然我不会这样做。

Pre Ruby 2.3

我通常把这样的东西放进我的初始化器中:

 Class Hash def deep_fetch *args x = self args.each do |arg| x = x[arg] return nil if x.nil? end x end end 

然后

 response.deep_fetch 'PaReqCreationResponse', 'ThreeDSecureVERes', 'Message', 'VERes', 'CH', 'enrolled' 

在一个古怪的情况下。

社区中的普遍共识似乎是避免尝试和孤独的运营商&.

Ruby 2.3及更高版本

现在有Hash#dig方法可以做到这一点:

重复检索与每个关键对象对应的值对象。

 h = { foo: {bar: {baz: 1}}} h.dig(:foo, :bar, :baz) #=> 1 h.dig(:foo, :zot) #=> nil 

http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig

hash值为零时,接受的答案将不会解释…

您可以在.try之前使用安全导航操作符重写您所拥有的内容,这将起作用

hash&.try(:[], :key)

但你也可以使用:

http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig

你可以通过哈希方式做到这一点的方法是…

 hash&.dig(:key1, :key2 ...) 

如果没有任何密钥提取,它将返回nil。

 { key1: { key2: 'info' } } 

会返回’info’

 { key1: { wrong_key: 'info' } } 

将返回nil

虽然hash&.[](:key)对训练有素的rubyist来说很优雅,但我只是使用hash && hash[:key]因为它对于追随我的程序员来说更好更直观,而且可能不熟悉复杂的ruby。 代码库中的一些额外字符有时可以为其他人保存大量的Google搜索。

(当然,鉴于你想要使用它的上下文是在条件语句中。)