Ruby массив для индексированного хэша? - PullRequest
10 голосов
/ 28 февраля 2012

Я часто строю таблицы поиска в Ruby, обычно для кеширования некоторых дорогих вычислений или для создания чего-то, что я передаю представлению. Я полагаю, что для этого должна быть короткая читаемая идиома, но мы не могли придумать ни одного. Например, предположим, что я хочу начать с

[65, 66, 67, ...]

и в итоге

{65 => "A", 66 => "B", 67 => "C", ...}

Не совсем красивые идиомы, о которых мы могли бы подумать:

array = (65..90).to_a

array.inject({}) {|hash, key| hash[key]=key.chr; hash}
{}.tap {|hash| array.each {|key| hash[key] = key.chr}}
Hash[array.zip(array.map{|key| key.chr})]

Но все это немного болезненно: трудно читать, легко испортить, не ясно в намерениях. Конечно, у Ruby (или у какого-нибудь помощника по Rails) есть какая-то приятная магия для этого?

1 Ответ

22 голосов
/ 28 февраля 2012

А как же

 Hash[(65..90).map { |i| [i, i.chr] }]

Я думаю, это довольно очевидно и самоочевидно. Кроме того, я не думаю, что существует гораздо более простой способ решения этой довольно специфической задачи, к сожалению, в Ruby нет чего-то сравнимого с пониманием dict в Python. Если вы хотите, вы можете использовать камень Facets , который включает в себя что-то близкое:

require 'facets'
(65..90).mash { |i| [i, i.chr] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...