基本上,我想创建散列{1959: 0, 1960: 0, 1961: 0, 1962: 0}
等等,而不需要手动写出它。
我想我从[*1959..2014]
开始,但不知道该从哪里开始。
您可以使用Hash::[]
:
Hash[(1959..1962).map { |x| [x, 0] }]
# => {1959=>0, 1960=>0, 1961=>0, 1962=>0}
或Ruby 2.1+中的Enumerable#to_h
:
(1959..1962).map { |x| [x, 0] }.to_h
# => {1959=>0, 1960=>0, 1961=>0, 1962=>0}
(为了输出的简洁性,更改了年末)
您可以将inject
与数组一起使用来形成哈希,如下所示:
(1959..2014).inject({}) { |hash, year| hash[year] = 0; hash }
inject
与每个类似,因为in在枚举对象的每个成员上运行,但它将2个参数传递给块、当前对象和一个可以用来收集结果的对象,在本例中是一个散列。
或者,正如@sawa在下面的评论中指出的那样:
(1959..2014).each_with_object({}) { |year, hash| hash[year] = 0 }
each_with_object
不需要像inject
那样在块的末尾返回对象。
[edit]只是使用了普通范围,而不是数组。增加了each_with_object
选项。
单向:
Hash[[*1959..2014].product([0])]