80

配列と、指定された値を返す関数があります。最終的には、配列の値をキー値とし、f(key_value) の結果を値とするハッシュマップを作成したいと考えています。ブロックを使用してこれを行う、配列の each/map に似た、クリーンでシンプルな方法はありますか?

したがって、同等のもの

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

しかし、これはシンプルで1行であるという点で、これに似ていますか?

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

7 に答える 7

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

ファセットのマッシュを使用する (列挙型をハッシュに変換する方法):

[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 に答える