我有一个数组和一个函数,它返回给定值的值。最终,我希望创建一个hashmap,它将数组的值作为键值,并将f(Key_Value)的结果作为值。有没有一种干净、简单的方法来使用块来完成这项工作,就像每一个/map of Array一样?
因此,相当于
hsh = {} [1,2,3,4].each do |x| hsh[x] = f(x) end
但看起来更像这个,因为它很简单,只有一行字?
results = array.map { | x | f(x) }
mepcadol1#
请注意,从Ruby 2.1.0开始,您还可以使用数组#to_h,如下所示:
[1,2,3,4].map{ |x| [x, f(x)] }.to_h
cbeh67ev2#
Ruby 2.6.0支持将块传递给to_h-方法。这为从数组创建散列提供了更短的语法:
to_h
[1, 2, 3, 4].to_h { |x| [x, f(x)] }
vlf7wbxs3#
您还可以将函数定义为散列的缺省值:
hash = Hash.new {|hash, key| hash[key] = f(key) }
然后,当您查找一个值时,散列将动态计算并存储它。
hash[10] hash.inspect #=> { 10 => whatever_the_result_is }
eblbsuwk4#
您需要each_with_object。
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}
exdqitrt5#
查看Hash::[]方法。
Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
nhn9ugyo6#
使用方面的mash(将可枚举值转换为散列的方法):
[1, 2, 3, 4].mash { |x| [x, f(x)] }
来自Ruby 2.1:
[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
kpbpu0087#
您正在寻找reduce()|inject()方法:
reduce()|inject()
elem = [1,2,3,4] h = elem.reduce({}) do |res, x| res[x] = x**2 res end puts h
传递给reduce({})的参数是作为res变量传递给块的中间对象的初始值。在每次迭代中,我们将新的key: value对添加到res Hash中,并重新获取要在下一次迭代中使用的Hash。
reduce({})
res
key: value
上面的方法预计算出一个非常实用的平方值散列:
{1=>1, 2=>4, 3=>9, 4=>16}
shstlldc8#
另外,index_with会很有帮助:
a = ['a', 'bsdf', 'wqqwc'] a.index_with(&:size) => {"a"=>1, "bsdf"=>4, "wqqwc"=>5}
8条答案
按热度按时间mepcadol1#
请注意,从Ruby 2.1.0开始,您还可以使用数组#to_h,如下所示:
cbeh67ev2#
Ruby 2.6.0支持将块传递给
to_h
-方法。这为从数组创建散列提供了更短的语法:vlf7wbxs3#
您还可以将函数定义为散列的缺省值:
然后,当您查找一个值时,散列将动态计算并存储它。
eblbsuwk4#
您需要
each_with_object
。另一个:
exdqitrt5#
查看Hash::[]方法。
nhn9ugyo6#
使用方面的mash(将可枚举值转换为散列的方法):
来自Ruby 2.1:
kpbpu0087#
您正在寻找
reduce()|inject()
方法:传递给
reduce({})
的参数是作为res
变量传递给块的中间对象的初始值。在每次迭代中,我们将新的key: value
对添加到res
Hash中,并重新获取要在下一次迭代中使用的Hash。上面的方法预计算出一个非常实用的平方值散列:
shstlldc8#
另外,index_with会很有帮助: