1

鉴于:

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

假设任何事情都可以nil,那么访问嵌套值而不被 nil 绊倒的最简单/最简洁的方法是什么?如果任何成员不存在,它应该只是 return nil

我们想出了这些:

纯红宝石:

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)

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

谢谢!

4

2 回答 2

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]
于 2013-06-06T01:56:12.320 回答
-2

我会更喜欢内联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 
于 2013-06-05T16:20:26.080 回答