简洁的Ruby哈希等价的Python dict.get()

时间:2013-11-28 05:50:07

标签: python ruby dictionary hash

知道我可以像这样操作Ruby默认的Hash值:

h={a:1, b:2, c:3}
h[:x] # => nil
h.default = 5
h[:x] # => 5
h.default = 8
h[:y] # => 8

但是,对于具有不同默认值的多个值重复执行此操作时会非常繁琐。

如果将散列传递给其他需要某些(可能缺少的)键的默认值的方法,它也会变得危险。

在Python中,我曾经

d={'a':1, 'b':2, 'c':3}
d.get('x', 5) # => 5
d.get('y', 8) # => 8

没有任何副作用。 Ruby中有这个get方法的等价物吗?

2 个答案:

答案 0 :(得分:23)

是的,它被称为fetch,它也可以占用一块:

h.fetch(:x, 5)
h.fetch(:x) {|missing_key| "Unfortunately #{missing_key} is not available"}

答案 1 :(得分:0)

#fetch的替代方法是简单地执行以下操作:

h[:x] || 5

在Python中,缺少键会引发KeyError,但在Ruby中缺少键只返回nil。

这有一个微妙的不同含义,因为默认情况会发生在:

  1. 密钥不在哈希
  2. 哈希中的密钥值已经是nil
  3. 而fetch只会对场景1产生影响。

    此代码最接近的Python等价物

    h.get('x') or 5
    

    (注意虽然这仍然不同,因为Python中的真实性/虚假性不同于Ruby)