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

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

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

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

4 ответов


на самом деле, ваш пример псевдо-кода в вашем вопросе верен.

для вашего хэш

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

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

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

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

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

редактировать

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


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

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

h[h.keys.first]

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

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

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


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