80

我有一个数组和一个返回给定值的值的函数。最终,我想创建一个哈希图,其中数组的值作为键值,f(key_value) 的结果作为值。有没有一种干净、简单的方法,比如类似于数组的每个/映射,使用块来做到这一点?

所以相当于

hsh = {}
[1,2,3,4].each do |x|
  hsh[x] = f(x)
end

但看起来与此更相似,因为它很简单而且只有一条线?

results = array.map { | x | f(x) }
4

7 回答 7

138

请注意,从 Ruby 2.1.0 开始,您还可以使用Array#to_h,如下所示:

[1,2,3,4].map{ |x| [x, f(x)] }.to_h
于 2015-06-17T09:29:53.783 回答
65

Ruby 2.6.0 允许将块传递给to_h-method。这使得从数组创建哈希的语法更短:

[1, 2, 3, 4].to_h { |x| [x, f(x)] }
于 2019-01-03T13:15:55.727 回答
40

您还可以将函数定义为哈希的默认值:

hash = Hash.new {|hash, key| hash[key] = f(key) }

然后,当您查找一个值时,哈希将即时计算并存储它。

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
于 2012-10-22T18:38:00.737 回答
33

你需要each_with_object.

def f x
  x * 2
end

t = [1, 2, 3, 4].each_with_object({}) do |x, memo|
  memo[x] = f(x)
end

t # => {1=>2, 2=>4, 3=>6, 4=>8}

另一个:

t2 = [1, 2, 3, 4].map{|x| [x, f(x)]}
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8}
于 2012-10-22T18:32:53.557 回答
24

查看Hash::[]方法。

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
于 2012-10-22T18:35:35.593 回答
11

使用 Facets 的mash(将可枚举转换为哈希的方法):

[1, 2, 3, 4].mash { |x| [x, f(x)] }

从 Ruby 2.1 开始:

[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
于 2012-10-22T19:12:42.500 回答
0

您正在寻找reduce()|inject()方法

elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
  res[x] = x**2
  res
end

puts h

传递给的参数是作为变量reduce({})传递给块的中间对象的初始值。res在每次迭代中,我们将新对添加key: valueresHash 并返回 Hash 以在下一次迭代中使用。

上面的方法预先计算了一个非常实用的平方值散列:

{1=>1, 2=>4, 3=>9, 4=>16}
于 2018-11-14T10:59:12.967 回答