Обратите внимание на различия в массиве - Ruby - PullRequest
0 голосов
/ 01 мая 2011

У меня есть два массива. Один набор навыков, другой набор навыков, которые может сделать пользователь. Для иллюстрации:

['swimming', 'rowing', 'cycling'] is the set of all skills

Теперь у пользователя может быть набор навыков, таких как:

['rowing', 'cycling']

Как я могу создать хороший хеш, который покажет, есть ли у пользователя текущий навык? Как и для этого конкретного пользователя, это будет:

{'swimming' => no, 'rowing' => yes, 'cycling', => yes}

P.S. Я действительно хочу сделать это с активными объектами записи в рельсах, но я полагаю, что это та же идея.

Ответы [ 3 ]

6 голосов
/ 01 мая 2011

Следующее даст true и false вместо yes и no.

all_skills = %w[swimming rowing cycling]
user_skills = %w[rowing cycling]

Hash[all_skills.map{|k| [k, user_skills.include?(k)]}]

или, если вы не против получить nil вместо no случаев, следующее быстрее.

Hash[user_skills.map{|k| [k, true]}]}
3 голосов
/ 01 мая 2011

Вот один из кратких способов сделать это:

ALL_SPORTS = ['swimming', 'rowing', 'cycling']

user_array = ['rowing', 'cycling']
user_hash = ALL_SPORTS.inject(Hash.new) { |h, sport| {sport => user_array.include?(sport)}.merge(h) }
2 голосов
/ 01 мая 2011

Я предполагаю, что когда вы говорите «да» и «нет», вам действительно нужны логические значения.Следующее не использует никаких промежуточных значений и опирается только на определенные пользователем виды спорта:

> h = Hash.new(false).merge(Hash[%w[rowing swimming].map {|v| [v.to_sym, true]}])
 => {:rowing=>true, :swimming=>true}

Теперь, если вы вызываете любой другой вид спорта в качестве ключа, которого у пользователя нет, вы получите желаемый результат:

> h[:golf]
 => false

Это также предполагает, что вам нужны символы для клавиш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...