python - Python 的 defaultdict 的 Ruby 等价物是什么?

标签 python ruby dictionary language-comparisons autovivification

在 Python 中,我可以创建一个散列,其中每个元素在第一次被引用时都有一个默认值(也称为“自动激活”)。这是一个例子:

from collections import defaultdict
d = defaultdict(int)
d["new_key"] += 1
print d

打印 dict 显示“new_key”的值为 1。

Ruby 中的等价物是什么?此代码抛出错误:

d = {}
d[:new_key] += 1
puts d

test.rb:3:in `<main>': undefined method `+' for nil:NilClass (NoMethodError)

最佳答案

您可以使用 default= 指定默认值:

d.default = 0

请注意,这并不会真正自动激活,它只是让 d[:new_key] 返回零,而不实际添加 :new_key 键。如果您打算修改默认值,default= 也会导致问题;这意味着 d.default = [ ] 几乎总是一个错误,因为在访问默认值时不会复制数组。

更好的选择通常是default_proc= :

d.default_proc = proc { |h, k| h[k] = 0 }

这允许您拥有不同的默认值,并允许您添加新键(或不取决于 proc 的结构)。

你也可以在创建Hash的时候设置这些:

d = Hash.new(0)
d = Hash.new { |h, k| h[k] = 0 }

关于python - Python 的 defaultdict 的 Ruby 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19757412/

相关文章:

c# - 目标数组的长度不足以复制集合中的所有项目。检查数组索引和长度

python - Django Tastypie 传递多部分表单数据

python - 使用 SWIG 包装结构**(指向指针的指针)参数

ruby - 无法安装 sinatra-contrib

c++ - 我怎样才能将 std::map 的迭代器递减一定数量?

c++ - 引用字典值以减少查找

python - 如何对 pyspark 中的一组列进行分桶?

javascript - 按钮仅在双击后切换

ruby - 如何在 Ruby 中使用 PKI(公钥/私钥)加密?

ruby - 从 Web 浏览器编程 ruby