红宝石:: Hash#dig

是否曾经想过是否有更好的方法遍历多层哈希或数组以检索特定值?幸运的是,Ruby 2.3引入了一种名为的新方法 dig。

  catalogue = {
    drinks: {
      apple_juice: {
        stock: 8,
        price_per_unit: 2.4
      },
      orange_juice: {
        stock: 4,
        price_per_unit: 2.2
      }
    }
  }

给定上述哈希值,我们将通过以下行访问每单位橙汁的价格。

  catalogue[:drinks][:carrot_juice][:price_per_unit]
  => NoMethodError: undefined method `[]' for nil:NilClass

为了减轻Rails引发的错误,我们需要在导航散列结构时检查每个键的存在。

  catalogue[:drinks] && catalogue[:drinks][:carrot_juice] && catalogue[:drinks][:carrot_juice][:price_per_unit]

通过使用 dig 我们遵循 DRY 并通过平稳处理nil值来检索每个键对象的值。

  catalogue.dig(:drinks, :carrot_juice, :price_per_unit)
  => nil
  catalogue.dig(:drinks, :apple_juice, :price_per_unit)
  => 2.4

其他连结
  • Ruby Doc – Hash#dig