【问题标题】:Accessing values in nested hash securly (without tripping over nil)? [duplicate]安全地访问嵌套散列中的值(没有绊倒 nil)? [复制]
【发布时间】:2013-06-01 10:45:00
【问题描述】:

给定:

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

假设任何东西都可以是nil,那么访问嵌套值而不被 nil 绊倒的最简单/最简洁的方法是什么?如果任何成员不存在,它应该只返回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)

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案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]
    

    【讨论】:

    • 知道如何在 Rails 5 应用程序中定义和使用safe_fetch 方法吗?
    【解决方案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 
    

    【讨论】:

    • 不错,不知道救援可以缩短
    • 盲人rescue 正在玩火,应尽可能避免。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2013-08-13
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多