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

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

a = [1, 2, 3, 4]

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

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

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

Ответы [ 14 ]

2 голосов
/ 18 июня 2013

Ответ: a.τwτ, но вы должны установить Pyper сначала ...

Pyper intro: Знаете ли вы Lispy car и cdr, возвращающие "first" и "rest" массива? Просто для нужд, подобных вашей, я сделал расширение этого механизма Lispy. Она называется pyper и позволяет вам также получить доступ ко 2-му, отдыху со 2-го, 3-го, отдыху из 3d, а также последнему, ко всему, кроме последнего и т. Д. Об этом писать особо нечего, но также можно составлять буквы точно так же как caar, cadr, cdadar и т. д., известные из Lisp:

# First, gem install pyper
require 'pyper'
include Pyper
a = %w/lorem ipsum dolor sit amet/
# To avoid confusion with other methods, and also because it resembles a rain gutter,
# Greek letter τ is used to delimit Pyper methods:
a.τaτ #=> "lorem"
a.τdτ #=> ["ipsum", "dolor", "sit", "amet"]
a.τbτ #=> "ipsum"
a.τeτ #=> ["dolor", "sit", "amet"]
a.τcτ #=> "dolor" (3rd)
a.τzτ #=> "amet" (last)
a.τyτ #=> "sit" (2nd from the end)
a.τxτ #=> "dolor" (3rd from the end)

и, наконец, ответ на ваш вопрос:

a.τwτ #=> ["lorem", "ipsum", "dolor", "sit"] (all except last)

Есть еще:

a.τuτ #=> ["lorem", "ipsum", "dolor"] (all except last 2)
a.τ1τ #=> ["lorem", "ipsum"] (first 2)
a.τ8τ #=> (last 2)
a.τ7τ #=> (last 3)

Сочинения:

a.τwydτ #=> "olor" (all except 1st letter of the last word of all-except-last array)

Также имеется больше командных символов, чем просто a..f, u..z и 0..9, наиболее заметно m, что означает карту:

a.τwmbτ #=> ["o", "p", "o", "i"] (second letters of all-except-last array)

Но другие командные символы слишком горячие и не очень удобны в использовании.

1 голос
/ 20 мая 2014

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

class Array
  def all_but_the_last(n)
    self.first(self.size - n)
  end
end

Теперь вы можете сделать следующее:

arr = ["One", "Two", "Three", "Four", "Five"]
# => ["One", "Two", "Three", "Four", "Five"]

arr.all_but_the_last(1)
# => ["One", "Two", "Three", "Four"]

arr.all_but_the_last(3)
# => ["One", "Two"]

arr.all_but_the_last(5)
# => []

arr.all_but_the_last(6)
# ArgumentError: negative array size

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

1 голос
/ 07 октября 2011

Создает новый массив со всеми, кроме последних, элементами оригинала:

ary2 = ary.dup
ary2.pop

Обратите внимание, что некоторые другие предложили использовать #pop. Если вы в порядке, измените массив на месте, это нормально. Если вы не согласны с этим, то сначала скопируйте массив, как в этом примере.

0 голосов
/ 17 июля 2014
a = [1,2,3,4]

a[0..(a.length - 2)]
=> [1,2,3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...