相当于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搜索。
(当然,鉴于你想要使用它的上下文是在条件语句中。)