假设我有一个Ruby数组
a = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
如果我想要除了第一项以外的所有项目,我可以写a.drop(1)
,这很棒.但是,如果我想要除了最后一项之外的所有项目,我只能想到这一点
a[0..-2] # or
a[0...-1]
Run Code Online (Sandbox Code Playgroud)
但这些都不像使用那么干净drop
.我缺少任何其他内置方式?
Dig*_*oss 124
也许...
a = t # => [1, 2, 3, 4]
a.first a.size - 1 # => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
要么
a.take 3
Run Code Online (Sandbox Code Playgroud)
要么
a.first 3
Run Code Online (Sandbox Code Playgroud)
要么
a.pop
Run Code Online (Sandbox Code Playgroud)
这将返回最后一个并保留数组前面的所有内容
或让电脑为晚餐工作:
a.reverse.drop(1).reverse
Run Code Online (Sandbox Code Playgroud)
要么
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]
Run Code Online (Sandbox Code Playgroud)
Mir*_*ich 87
出于好奇,你为什么不喜欢a[0...-1]
?你想得到一个数组,所以切片运算符似乎是惯用的选择.
但是如果你需要在整个地方调用它,你总是可以选择向Array类添加一个更友好名称的方法,就像DigitalRoss建议的那样.也许是这样的:
class Array
def drop_last
self[0...-1]
end
end
Run Code Online (Sandbox Code Playgroud)
mon*_*ike 55
另一个很酷的技巧
>> *a, b = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2]
>> b
=> 3
Run Code Online (Sandbox Code Playgroud)
小智 39
如果要对pop()
数组执行操作(这将导致删除最后一项),但您有兴趣获取数组而不是弹出元素,则可以使用tap(&:pop)
:
> arr = [1, 2, 3, 4, 5]
> arr.pop
=> 5
> arr
=> [1, 2, 3, 4]
> arr.tap(&:pop)
=> [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
pix*_*rth 33
我是这样做的:
my_array[0..-2]
Run Code Online (Sandbox Code Playgroud)
axe*_*rge 21
如何增加drop方法本身,例如像这样?
class Array
def drop(n)
n < 0 ? self[0...n] : super
end
end
Run Code Online (Sandbox Code Playgroud)
然后你可以使用负大小从末尾删除元素,如下所示:
[1, 2, 3, 4].drop(-1) #=> [1, 2, 3]
[1, 2, 3, 4].drop(-2) #=> [1, 2]
Run Code Online (Sandbox Code Playgroud)
dbr*_*dbr 18
a[0...-1]
似乎是最好的方式.为此目的创建了数组切片语法...
或者,如果你不介意修改数组,你可以调用a.pop
:
>> a = [1, 2, 3, 4]
>> a.pop
>> a
=> [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
Fra*_*nez 12
这是方式:
[1,2,3,4,5][0..-1-1]
Run Code Online (Sandbox Code Playgroud)
但让我们来解释一下这是如何工作的:
a = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
下一个示例将返回从0位置到最后位置的所有记录
a[0..-1]
=> [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
下一个示例将从1个位置返回到最后的记录
a[1..-1]
=> [2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
在这里,你有你需要的东西.下一个示例将返回从0位置到最后1位的记录
a[0..-1-1]
=> [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
bou*_*uby 11
去除一行中的最后一个元素,其余的返回
[1, 2, 4, 5, 6].reverse.drop(1).reverse
Run Code Online (Sandbox Code Playgroud)
说真的,
[1,2,3,4][0..-2]
#=> [1,2,3]
Run Code Online (Sandbox Code Playgroud)
你试过"拿"吗
a.take(3)
Run Code Online (Sandbox Code Playgroud)