相当于Rails的安全导航尝试散列

时间:2016-03-10 17:02:52

标签: ruby-on-rails ruby

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

5 个答案:

答案 0 :(得分:48)

public static void main(String arg[]) { HashMap<integer, ArrayList<String>> map = new HashMap<integer, ArrayList<String>>(); ArrayList<String> namelist = new ArrayList<String>(); obj.add("john"); obj.add("kel"); obj.add("abraham"); obj.add("sonny"); obj.add("aron"); map.put(3, namelist); for (int i = 0; i < namelist.size(); i++) { String element = namelist[i]; String nextElement = elements[i+1]; } } 不等同于Rails&#39; &.,但您可以使用try进行哈希。只是使用它,没什么特别的。

&.

虽然我不这样做。

答案 1 :(得分:37)

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

std::cout<<std::numeric_limits<float>::max()<<std::endl; std::cout<<std::numeric_limits<float>::epsilon()<<std::endl; 为零时,接受的答案将不会考虑...

您可以在hash之前使用安全导航操作符重写您所拥有的内容

.try

但您也可以使用:

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

你可以通过哈希来做到这一点......

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

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

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

会返回'info'

{ key1: { key2: 'info' } } 

会返回{ key1: { wrong_key: 'info' } }

答案 4 :(得分:0)

使用安全导航运算符比使用&.[](:slug)更为清晰易懂的方法是使用fetch方法:

&.fetch(:slug)

如果可能未定义密钥,则可以将第二个参数用作默认值:

&.fetch(:slug, nil)
相关问题