Ruby数组的最后一个元素

比方说,我有一个Ruby数组

a = [1, 2, 3, 4] 

如果我想要的只是第一个项目,我可以写一个a.drop(1) ,这很棒。 如果我只想要最后一个项目,我只能这样想

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

但这些看起来都不如使用drop干净。 任何其他内置的方式,我失踪了?

也许…

 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] 

出于好奇,你为什么不喜欢a[0...-1] ? 你想得到一个数组的切片,所以切片运算符看起来就像是惯用的select。

但是如果你需要在这个地方调用它,你总是可以select为Array类添加一个更友好的名字,就像DigitalRossbuild议的那样。 也许是这样的:

 class Array def drop_last self[0...-1] end end 

另一个很酷的把戏

 >> *a, b = [1,2,3] => [1, 2, 3] >> a => [1, 2] >> b => 3 

如果你想对数组执行一个pop()操作(这会导致最后一个项目被删除),但是你有兴趣获得数组而不是popup的元素,你可以使用tap(&:pop)

 > arr = [1, 2, 3, 4, 5] > arr.pop => 5 > arr => [1, 2, 3, 4] > arr.tap(&:pop) => [1, 2, 3] 

如何增加drop方法本身,例如像这样?

 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] 

a[0...-1]似乎是最好的方法。 数组切片语法是为了这个目的而创build的…

另外,如果你不介意修改数组,你可以调用a.pop

 >> a = [1, 2, 3, 4] >> a.pop >> a => [1, 2, 3] 

我这样做:

 my_array[0..-2] 

这是方式:

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

但让我们来解释一下这是如何工作的

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

下一个例子将返回从0到最后的所有logging

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

下一个例子将从1个位置返回logging

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

在这里,你有你所需要的。 下一个例子将返回从0到最后1的logging

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

你试过“拿”

 a.take(3) 

用余数返回去除一行中的最后一个元素

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

虽然严重,

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

这使得一个新的arrays,除了最原始的元素:

 ary2 = ary.dup ary2.pop 

请注意,还有一些人build议使用#pop。 如果你可以修改arrays,那很好。 如果你不这样做,那么首先复制数组,如在这个例子中。

我经常发现自己想要的只是数组中最后的n个元素。 我已经assembly了我自己的function来做到这一点,我发现比其他解决scheme更可读:

 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,以便调用者负责如何使用此方法。 我很乐意听到这种方法的评论/批评。

答: a.τwτ ,但你必须先安装Pyper …

Pyper简介:你知道Lispy carcdr返回arrays的“第一”和“rest”? 只是为了像你这样的需求,我做了Lispy机制的扩展。 它叫做pyper ,它也允许你访问第二个,第二个,第三个rest,第三个rest,还有最后一个除了最后一个等等。这不会写太多,但它也允许字母组成,只是像Lisp的cdadarcdadarcdadar等已知:

 # 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..fu..z0..9 ,还有更多的命令字符,最显着的是m ,意思是map:

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

但其他命令字符太热,目前不太好用。

尝试这个

arr = [1, 2, 3, 4, 5, 6] arr.delete(arr[-1])

 a = [1,2,3,4] a[0..(a.length - 2)] => [1,2,3]