kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Ji Mun
Ji Mun
Вопрос

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

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

То есть что-то, что эквивалентно

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

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

results = array.map { | x | f(x) }
53 2012-10-22T18:30:48+00:00 7
Rouven Weßling
Rouven Weßling
Редактировал вопрос 14-го июня 2016 в 6:47
Программирование
ruby
hashmap
 Knotty66
Knotty66
17-го июня 2015 в 9:29
2015-06-17T09:29:53+00:00
Дополнительно
Источник
Редактировать
#17528749

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

в

[1,2,3,4].map{ |x| [x, f(x)] }.to_h
Ethan Kaminski
Ethan Kaminski
Редактировал ответ 20-го августа 2016 в 11:23
111
0
Решение / Ответ
Zach Kemp
Zach Kemp
22-го октября 2012 в 6:38
2012-10-22T18:38:00+00:00
Дополнительно
Источник
Редактировать
#17528747

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

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

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

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
28
0
Sergio Tulentsev
Sergio Tulentsev
22-го октября 2012 в 6:32
2012-10-22T18:32:53+00:00
Дополнительно
Источник
Редактировать
#17528744

Вам нужен 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}
23
0
Matt Huggins
Matt Huggins
22-го октября 2012 в 6:35
2012-10-22T18:35:35+00:00
Дополнительно
Источник
Редактировать
#17528746

Проверьте метод Hash::[].

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
21
0
 tokland
tokland
22-го октября 2012 в 7:12
2012-10-22T19:12:42+00:00
Дополнительно
Источник
Редактировать
#17528748

Используя фасеток' Маш (способ конвертировать перечисляемые в хэши):

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

Из Ruby 2.1:

[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
 tokland
tokland
Редактировал ответ 21-го августа 2016 в 7:35
8
0
 Timitry
Timitry
3-го января 2019 в 1:15
2019-01-03T13:15:55+00:00
Дополнительно
Источник
Редактировать
#17528751

Руби 2.6.0 позволяет передавая блок на to_h`-метод. Это позволяет еще более короткий синтаксис для создания хэша из массива:

[1, 2, 3, 4].to_h { |x| [x, f(x)] }
8
0
 Tombart
Tombart
14-го ноября 2018 в 10:59
2018-11-14T10:59:12+00:00
Дополнительно
Источник
Редактировать
#17528750

Вы'вновь ищу уменьшить()|вколоть (метод):

elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
  res[x] = x**2
  res
end

puts h

Аргумент к сокращению ({})- начальное значение промежуточного объекта, который передается в блокРЭСпеременной. В каждой итерации мы'повторное добавление новых ключевых пара: значениекРЭС` хэш и возврата хэш используется в следующей итерации.

Описанный выше метод precomputes очень практичный хэш-квадратов значений:

{1=>1, 2=>4, 3=>9, 4=>16}
0
0
Похожие сообщества 6
Чат по Руби
Чат по Руби
2 350 пользователей
Чат-болталка для учеников руби-школы и не только. Сайт школы: https://rubyschool.us Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13 или тут https://graph.org/Pravila-chata-Rubi-shkoly-03-13
Открыть telegram
RubyRush.ru
RubyRush.ru
2 295 пользователей
Дружелюбный чат для начинающих программистов и учеников rubyrush.ru, обсуждаем программирование, ruby и т. п. Правила чата https://telegra.ph/22-09-05-3 Популярные вопросы (с ответами) https://telegra.ph/22-09-17-4 💎🦜
Открыть telegram
pro.rb (Ruby/Rails / RU)
pro.rb (Ruby/Rails / RU)
1 183 пользователей
Язык программирования Ruby: https://ru.wikipedia.org/wiki/Ruby Вакансии: @rubyjob
Открыть telegram
Ruby — вакансии и аналитика
Ruby — вакансии и аналитика
358 пользователей
Публикуем вакансии и запросы на поиск работы по направлению Ruby. Full-time, part-time, remote и разовые подработки. Обмен инсайдами и аналитикой на рынке труда. Тематическое общение: @ruby_ru См. также: @python_jobs, @nodejs_jobs, @devops_jobs
Открыть telegram
Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
345 пользователей
Открыть telegram
Ruby Talks
Ruby Talks
255 пользователей
Национальная Флеймотека
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией