我有一个简单的数组:
arr = ["apples", "bananas", "coconuts", "watermelons"]
我还有一个函数f
,它将对单个字符串输入执行操作并返回值。这个操作的开销非常大,所以我想在哈希表中记下结果。
我知道我可以用下面这样的代码生成所需的散列:
h = {}
arr.each { |a| h[a] = f(a) }
我想做的是不需要初始化h,这样我就可以写出这样的代码:
h = arr.(???) { |a| a => f(a) }
这是可以做到的吗?
发布于 2010-05-31 20:25:53
假设您有一个函数,其funtastic名称为:"f“
def f(fruit)
fruit + "!"
end
arr = ["apples", "bananas", "coconuts", "watermelons"]
h = Hash[ *arr.collect { |v| [ v, f(v) ] }.flatten ]
将为您提供:
{"watermelons"=>"watermelons!", "bananas"=>"bananas!", "apples"=>"apples!", "coconuts"=>"coconuts!"}
更新:
正如评论中提到的,Ruby 1.8.7为此引入了更好的语法:
h = Hash[arr.collect { |v| [v, f(v)] }]
发布于 2012-07-01 08:26:53
h = arr.each_with_object({}) { |v,h| h[v] = f(v) }
发布于 2019-01-03 21:25:03
Ruby2.6.0通过passing a block to the to_h
method实现了更短的语法
arr.to_h { |a| [a, f(a)] }
https://stackoverflow.com/questions/2943422
复制相似问题