Все, кроме последнего элемента массива Ruby - PullRequest
125 голосов
/ 22 октября 2009

Допустим, у меня есть массив Ruby

a = [1, 2, 3, 4]

Если я хочу все, кроме первого элемента, я могу написать a.drop(1), и это здорово. Если я хочу все, кроме последнего элемента, я могу думать только об этом

a[0..-2]   # or
a[0...-1]

но ни один из них не выглядит таким чистым, как при использовании drop. Какие-нибудь другие встроенные способы, которые я пропускаю?

Ответы [ 14 ]

120 голосов
/ 22 октября 2009

Возможно ...

a = t               # => [1, 2, 3, 4]
a.first a.size - 1  # => [1, 2, 3]

или

a.take 3

или

a.first 3

или

a.pop

, который вернет последний и оставит массив со всем перед ним

или заставить компьютер работать на обед:

a.reverse.drop(1).reverse

или

class Array
  def clip n=1
    take size - n
  end
end
a          # => [1, 2, 3, 4]
a.clip     # => [1, 2, 3]
a = a + a  # => [1, 2, 3, 4, 1, 2, 3, 4]
a.clip 2   # => [1, 2, 3, 4, 1, 2]
84 голосов
/ 24 октября 2009

Из любопытства, почему тебе не нравится a[0...-1]? Вы хотите получить срез массива, поэтому оператор среза выглядит как идиоматический выбор.

Но если вам нужно вызывать это повсеместно, у вас всегда есть возможность добавить метод с более понятным именем в класс Array, как предложил DigitalRoss. Возможно так:

class Array
    def drop_last
        self[0...-1]
    end
end
53 голосов
/ 16 мая 2013

Еще один крутой трюк

>> *a, b = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2]
>> b
=> 3
35 голосов
/ 23 октября 2014

Если вы хотите выполнить pop() операцию с массивом (что приведет к удалению последнего элемента), но вы заинтересованы в получении массива вместо вытесненного элемента, вы можете использовать tap(&:pop) :

> arr = [1, 2, 3, 4, 5]
> arr.pop
=> 5
> arr
=> [1, 2, 3, 4]
> arr.tap(&:pop)
=> [1, 2, 3]
27 голосов
/ 03 марта 2015

Я делаю это так:

my_array[0..-2]
22 голосов
/ 14 мая 2011

Как насчет дополнения самого метода отбрасывания, например, вот так?

class Array
  def drop(n)
    n < 0 ? self[0...n] : super
  end
end

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

[1, 2, 3, 4].drop(-1) #=> [1, 2, 3]
[1, 2, 3, 4].drop(-2) #=> [1, 2]
18 голосов
/ 24 октября 2009

a[0...-1] кажется лучшим способом. Синтаксис среза массива был создан именно для этой цели ...

В качестве альтернативы, если вы не возражаете против изменения массива на месте, вы можете просто позвонить a.pop:

>> a = [1, 2, 3, 4]
>> a.pop
>> a
=> [1, 2, 3]
10 голосов
/ 30 января 2015

Это путь:

[1,2,3,4,5][0..-1-1]

Но давайте объясним, как это работает:

a = [1,2,3,4,5]

Следующий пример вернет все записи, с позиции 0 до последней

a[0..-1]
=> [1, 2, 3, 4, 5]

Следующий пример вернет записи с 1 позиции на последнюю

a[1..-1]
=> [2, 3, 4, 5]

И вот у вас есть то, что вам нужно. Следующий пример вернет записи с позиции 0 до последней-1

a[0..-1-1]
=> [1, 2, 3, 4]
10 голосов
/ 21 марта 2014

Чтобы избавиться от последнего элемента в одной строке, а остаток возвращает

[1, 2, 4, 5, 6].reverse.drop(1).reverse

Если серьезно,

[1,2,3,4][0..-2]
#=> [1,2,3]
6 голосов
/ 22 октября 2009

Вы пробовали "взять"

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