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 car
和cdr
返回arrays的“第一”和“rest”? 只是为了像你这样的需求,我做了Lispy机制的扩展。 它叫做pyper
,它也允许你访问第二个,第二个,第三个rest,第三个rest,还有最后一个除了最后一个等等。这不会写太多,但它也允许字母组成,只是像Lisp的cdadar
, cdadar
, cdadar
等已知:
# 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
,意思是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]