2013-06-05 44 views
1

考虑:访问嵌套哈希securly中的值(不会跳过零)?

array = {first: {second: {one: 1, two: 2, three: 3 }}} 

假设什么都可以nil,这将是访问嵌套的值,而不绊倒零最简单/最简洁的方式?如果有任何成员不存在,则应该返回nil

我们想出了这些:

纯Ruby:

value = array.fetch(:first, {}).fetch(:second, {}).fetch(:four, nil) 
value = begin array[:first][:second][:four]; rescue; end 

Ruby on Rails的:

value = array.try(:[], :first).try(:[], :second).try(:[], :four) 

你能想出?你更喜欢哪种方法,为什么?

谢谢!

回答

1

它是编码风格的问题。使用Ruby 2.0,你也可以做到这一点,我可能更喜欢:

value = array[:first].to_h[:second].to_h[:four] 

如果你不想键入to_h每一次,你可以定义一个方法:

class Hash 
    def safe_fetch k; self[k].to_h end 
end 
value = array.safe_fetch(:first).safe_fetch(:second)[:four] 
+0

任何想法如何定义和使用Rails 5应用程序中的'safe_fetch'方法? –

-1

我更喜欢inline rescue,因为它更多Rubyistic

array = {first: {second: {one: 1, two: 2, three: 3 }}} 
value = array[:first][:second][:four] rescue nil # => nil 
value = array[:first][:second][:two] rescue nil # => 2 
+1

不错,没”不知道救援人员可能会缩短 –

+5

盲人救援正在玩火,应尽可能避免。 – tadman