Получите первый элемент из массива Ruby в хеше

У меня есть хеш Ruby, который выглядит так:

h = {"side1"=>["green", "Green"], "side2"=>["verde", "Verde"]}

Как я могу получить первый (или последний) элемент по определенному ключу в хеше?

Ответ 1

Собственно, ваш пример псевдокода в вашем вопросе правильный.

Для вашего хеша

h = {
   "side1" => ["green", "Green"], 
   "side2" => ["verde", "Verde"]
}

ключи 'side1' и 'side2' (с их значениями справа от хеш-ключа)

Итак, h['side2'].first говорит, что для значения ключа 'side2' получить первый элемент в значении ["verde", "Verde"], который является массивом. h['side2'][0] также будет работать. псевдоним first является удобным методом.

Чтобы получить последний элемент массива, не зная, насколько он большой, используйте отрицательный индекс. например h['side2'][-1], что в этом случае эквивалентно h['side2'][1].

Обратите внимание, что ключи в хеше относятся к тому, является ли это строкой или символом. То есть h[:side2] возвращает nil, поскольку ключ не был установлен. Rails имеет класс HashWithIndifferentAccess, который обрабатывает символы и строки как эквивалентные ключи.

ИЗМЕНИТЬ

Я должен был упомянуть, что я протестировал свой ответ в irb. irb - отличный способ проверить ваши идеи о том, что может и может не работать. В командной строке терминала введите irb, введите и воспроизведите с рубином.

Ответ 2

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

Конечно, "первый элемент" произволен в хеше, но метод keys возвращает список всех ключей, отсортированных по какой-то магии. Если вам нравится этот порядок сортировки, вы можете получить "первый" метод с помощью

h[h.keys.first]

Ответ 3

Любой хеш имеет ключи и значения вы можете просто сделать

hash.values.first
hash.values.last
hash.keys.first
hash.keys.last

Таким образом, у вас будет массив значений, которые вы хотите в случае первого или последнего

Ответ 4

Да. puts h["side2"].first должен работать. Думаю, это говорит о том, что Ruby следует принципу наименьшего удивления, где ваш псевдокод оказался таким же, как и фактический код.: -)