как » взять` элементы с 1 по 4 массива Ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть массив объектов, и я хотел бы взять элементы с 1 по 4, но take не принимаю диапазон.

 user.addresses.take(1...4)
 

Каков способ достичь этого? В Rails, так что, если есть какое-то дополнение ActiveSupport, я тоже мог бы это использовать.

Комментарии:

1. Это 1 первый элемент или второй? Потому что индексы массива основаны на нуле.

2. @Стефан в данном случае, второй.

3. Если addresses есть связь и есть много записей, которые вы, возможно, захотите использовать user.addresses.offset(1).limit(4) , что превратит это в запрос к базе данных.

Ответ №1:

take Метод Ruby принимает одно целое значение для количества элементов, которые необходимо принять. Вызов [0, 1, 2, 3, 4].take(4) вернет 0-й, 1-й, 2-й и 3-й элементы массива, или [0, 1, 2, 3] .

Если вы хотите пропустить 0-й элемент, вы можете подумать slice . Вызов [0, 1, 2, 3, 4].slice(1..) вернется [1, 2, 3, 4] . Вы можете ограничить диапазон, чтобы выбрать подмножество. Вы также можете использовать [] в качестве метода в массиве, как slice псевдоним для [] . Синтаксис бесконечного диапазона x.. был введен в Ruby 2.6. В более ранних версиях Ruby вы могли бы сделать это с 1..-1 помощью instead.

Комментарии:

1. Или более кратко, как просто: [0, 1, 2, 3, 4][1..]

2. @ChrisDutton Да, я добавлю это. Обычно я предпочитаю slice быть немного более откровенным, и это менее сбивает с толку людей, происходящих из не рубинового фона.

3. Для более описательного подхода также ary.drop(1).take(4) есть, но в большинстве случаев вы увидите ary[1, 4] (возьмите 4, начиная с 1) или ary[1..4] (возьмите элементы от 1 до 4) из-за краткости.