2013-06-05 48 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