除了Ruby数组的最后一个元素之外,其余元素都是

除了Ruby数组的最后一个元素之外,其余元素都是,ruby,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] 或 或 或 它将返回最后一个数组,并将其之前

假设我有一个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.reverse.drop(1).reverse

你试过“拿走”吗


出于好奇,您为什么不喜欢[0…-1]?您希望获得数组的切片,因此切片操作符似乎是惯用的选择

但是如果你需要到处调用它,你总是可以选择像DigitalRoss建议的那样,在Array类中添加一个更友好的方法。也许是这样的:

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

a[0…-1]
似乎是最好的方法。数组切片语法正是为此目的创建的

或者,如果您不介意就地修改数组,您可以调用
a.pop

>> a = [1, 2, 3, 4]
>> a.pop
>> a
=> [1, 2, 3]
> 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

这将生成一个新数组,其中包含除原始数组最后一个元素以外的所有元素:

ary2 = ary.dup
ary2.pop
注意,还有一些人建议使用#pop。如果您可以在适当的位置修改阵列,则可以。如果您对此不满意,请先复制阵列,如本例所示。

另一个很酷的技巧

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

回答:
a.τwτ
,但您必须先安装

Pyper简介:你知道Lispy
car
cdr
返回数组的“第一个”和“其余”吗?为了满足您这样的需求,我对这个Lispy机制进行了扩展。它被称为
pyper
,它还允许您访问第二个、第二个、第三个、第三个、第三个、以及最后一个,除了最后一个等之外的所有内容。这不太值得写,但它还允许字母组合,就像
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, 2, 4, 5, 6].reverse.drop(1).reverse
说真的

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

我经常发现自己只需要数组的最后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,以便调用者负责如何使用此方法。我很想听到对这种方法的评论/批评。

如果您想对数组执行
pop()
操作(这将导致最后一项被删除),但您希望获得数组而不是弹出的元素,您可以使用
点击(&:pop)

a = [1,2,3,4]

a[0..(a.length - 2)]
=> [1,2,3]
这是一种方式:

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

但让我们解释一下它是如何工作的:

a = [1,2,3,4,5]
下一个示例将返回从0位置到最后一个位置的所有记录

a[0..-1]
=> [1, 2, 3, 4, 5]
a[1..-1]
=> [2, 3, 4, 5]
下一个示例将返回从1个位置到最后一个位置的记录

a[0..-1]
=> [1, 2, 3, 4, 5]
a[1..-1]
=> [2, 3, 4, 5]
这是你需要的。下一个示例将返回从0位置到最后1位置的记录

a[0..-1-1]
=> [1, 2, 3, 4]
我是这样做的:

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


数组中添加方法对我来说似乎是最好的方法。大多数项目最后都会有一个
core\u ext.rb
文件,扩展名很少。有些库实际上都是这样的扩展:
ActiveSupport
。这很有趣,我想知道它有多普遍。人们对诗歌模式有什么看法?人们是如何向Ruby社区提交这个
clip
方法的?我真的认为这应该在那里,猴子补丁是最好的。我喜欢
a.reverse.drop(1)。reverse
策略一般来说,这是
a.take(a.size-1)
;是的,我考虑过这个选项。根据,drop是ruby 1.9,而不是ruby 1.8.6。性能如何。。如果我在1000次迭代中使用这些答案。。哪一个会赢?换句话说,哪一个解决方案不会穿越引擎盖下的阵列?另一种方式,a-([a.size])当水滴如此干净时,它看起来就像一堆杂乱的东西。这没什么大不了的,但很难一眼就确认它是完全正确的。顺便说一句,我更喜欢你的名字,
drop\u last
,我喜欢用-1比用它优雅得多。Length好奇,第三个
是什么意思?。。。表示不包括最后一项,-1是最后一项。如果你做了两个点,那么它将包括最后一项,三个点,那么它将不包括最后一项。使用切片操作符获取数组的尾部时要小心:它可能返回
nil
[[1..-1]
->
nil
[[0…-1]
->
[],如果可以,请就地修改阵列。如果您对此不满意,则首先复制数组,如本例所示。这是一条重要的注释。您也可以将其添加到您的答案中。由于#pop没有爆炸(!),它修改原始数组的事实可能会逃过人们的注意。如果数组很大,这是非常低效的。你也可以将最后一个元素分配给一个变量供以后使用:
b=a.pop
Nice,不知道Ruby有这个;因此,
a,*b=[1,2,3]
将让我们以一种经典的car/cdr方式查看数组。老实说,我甚至不记得写过这样的评论:D现在删除了它……太简单了,太好了。我在4月1日读到这篇文章,所以我认为这是一个笑话。。。不。我不知道Ruby有这种东西这真是妙不可言。我对w感到困惑
a[0..-1-1]
=> [1, 2, 3, 4]
my_array[0..-2]