Ruby-将数组映射到hashmap

Ruby-将数组映射到hashmap,ruby,hashmap,Ruby,Hashmap,我有一个数组和一个函数,它返回给定值的值。最后,我想创建一个hashmap,将数组的值作为键值,并将f(key_value)的结果作为值。是否有一种干净、简单的方法(类似于数组的每个/map)来使用block进行此操作 所以这相当于 hsh = {} [1,2,3,4].each do |x| hsh[x] = f(x) end 但看起来更像这个,因为它很简单,只有一行 results = array.map { | x | f(x) } 您需要每个带有\u对象的\u def f x

我有一个数组和一个函数,它返回给定值的值。最后,我想创建一个hashmap,将数组的值作为键值,并将f(key_value)的结果作为值。是否有一种干净、简单的方法(类似于数组的每个/map)来使用block进行此操作

所以这相当于

hsh = {}
[1,2,3,4].each do |x|
  hsh[x] = f(x)
end
但看起来更像这个,因为它很简单,只有一行

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

您需要
每个带有\u对象的\u

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}
看看这个方法


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

hash = Hash.new {|hash, key| hash[key] = f(key) }
然后,当您查找一个值时,哈希将计算并动态存储它

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
使用Facets'(将枚举转换为哈希的方法):

来自Ruby 2.1:

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

请注意,由于Ruby 2.1.0,您还可以使用:

[1,2,3,4]。将{x |[x,f(x)]}映射到
您正在寻找:

传递给
reduce({})
的参数是作为
res
变量传递给块的中间对象的初始值。在每次迭代中,我们都将新的pair
key:value
添加到
res
散列中,并重新存储散列以在下一次迭代中使用

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

{1=>1, 2=>4, 3=>9, 4=>16}
Ruby 2.6.0支持。这使得从数组创建哈希的语法更加简短:

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

请注意,这不适用于惰性枚举数,但Ruby 2.1.0的
.to_h
适用于惰性枚举数。对于阅读此答案并喜欢此答案的人:另请参阅Timitry的答案中的另类风格(目前位于列表的下方)
elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
  res[x] = x**2
  res
end

puts h
{1=>1, 2=>4, 3=>9, 4=>16}
[1, 2, 3, 4].to_h { |x| [x, f(x)] }