Answers:
也许...
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]
Array
对我来说,添加方法似乎是最好的方法。大多数项目最终都带有一个core_ext.rb
很少扩展名的文件。某些库实际上是所有这样的扩展:ActiveSupport
例如。
a.reverse.drop(1).reverse
策略。;-)
出于好奇,您为什么不喜欢a[0...-1]
?您想获取数组的一个切片,所以切片运算符似乎是惯用的选择。
但是,如果您需要在各处调用此方法,则始终可以选择向Array类添加名称更友好的方法,如DigitalRoss建议的那样。也许像这样:
class Array
def drop_last
self[0...-1]
end
end
drop_last
顺便说一句,我更喜欢您的名字……
.
?
nil
:[][1..-1]
-> nil
,[][0...-1]
->[]
另一个很酷的把戏
>> *a, b = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2]
>> b
=> 3
a, *b = [1,2,3]
,让我们以经典的car / cdr方式查看阵列。
如果要对pop()
数组执行操作(这将导致删除最后一项),但是您有兴趣获取数组而不是弹出元素,则可以使用tap(&:pop)
:
> arr = [1, 2, 3, 4, 5]
> arr.pop
=> 5
> arr
=> [1, 2, 3, 4]
> arr.tap(&:pop)
=> [1, 2, 3]
a[0...-1]
似乎是最好的方法。正是为此目的而创建了数组切片语法。
另外,如果您不介意修改数组,则可以调用a.pop
:
>> a = [1, 2, 3, 4]
>> a.pop
>> a
=> [1, 2, 3]
b = a.pop
这是这样的:
[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位置返回到last-1
a[0..-1-1]
=> [1, 2, 3, 4]
-2
而不是-1-1
。
答案: a.τwτ
,但是您必须先安装Pyper ...
Pyper简介:您知道Lispy car
并cdr
返回数组的“第一”和“其余”吗?为了满足您的需求,我扩展了此Lispy机制。它叫做pyper
,它还允许您访问2nd,2nd,3rd,3d和last,除了last等以外的所有内容。虽然写起来并不多,但是它也允许字母组合,就像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
,意思是map:
a.τwmbτ #=> ["o", "p", "o", "i"] (second letters of all-except-last array)
但是其他命令字符太热了,目前还不太容易使用。
这将创建一个包含原始元素的最后一个元素的新数组:
ary2 = ary.dup
ary2.pop
请注意,其他一些建议使用#pop。如果可以修改数组就可以了。如果您对此不满意,请首先将数组复制,如本例所示。
我经常发现自己想要数组的最后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,以便调用方负责他们如何使用此方法。我很想听听对这种方法的评论/批评。