Подтвердить что ты не робот

Ruby - отображение массива в hashmap

У меня есть массив и функция, которая возвращает значение, заданное значением. В конечном итоге я хочу создать хэшмап, который имеет значения массива в качестве значения ключа, и результат f (key_value) в качестве значения. Есть ли простой, простой способ, похожий на каждую/карту массива, делать это с помощью блока?

Итак, что-то, что эквивалентно

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

но выглядит более похожим на это, так как это простая и одна строка?

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

Ответ 1

Вы также можете определить функцию как значение по умолчанию для хэша:

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

Затем, когда вы просматриваете значение, хеш будет вычислять и хранить его на лету.

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }

Ответ 2

Обратите внимание, что с Ruby 2.1.0 вы также можете использовать Array # to_h, например:

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

Ответ 3

Ознакомьтесь с методом Hash:: [].

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

Ответ 4

Вам нужно 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}

Ответ 5

Использование 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