Ruby数组的最后一个元素

Pet*_*ter 130 ruby

假设我有一个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)

  • 将方法添加到"Array"对我来说似乎是最好的方法.大多数项目最终会得到一个`core_ext.rb`文件,其中包含很少的扩展名.有些库实际上是_all_扩展,例如:`ActiveSupport`. (5认同)
  • 我喜欢`a.reverse.drop(1).reverse`策略.;-) (5认同)
  • 有人如何将这个`clip`方法提交给Ruby社区?我真的认为这应该在那里,猴子修补是[错误的事情](http://www.catb.org/jargon/html/W/Wrong-Thing.html). (4认同)

Mir*_*ich 87

出于好奇,你为什么不喜欢a[0...-1]?你想得到一个数组,所以切片运算符似乎是惯用的选择.

但是如果你需要在整个地方调用它,你总是可以选择向Array类添加一个更友好名称的方法,就像DigitalRoss建议的那样.也许是这样的:

class Array
    def drop_last
        self[0...-1]
    end
end
Run Code Online (Sandbox Code Playgroud)

  • ...表示不包括最后一项,-1是最后一项.如果你做了两个点,那么它将包括最后一个项目,三个点然后它将不包括最后一个项目. (4认同)

mon*_*ike 55

另一个很酷的技巧

>> *a, b = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2]
>> b
=> 3
Run Code Online (Sandbox Code Playgroud)

  • 很好,不知道 Ruby 有这个;所以 `a, *b = [1,2,3]` 会让我们以经典的汽车/cdr 方式查看数组。 (2认同)

小智 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)

  • 那是一些光滑的红宝石。 (3认同)

pix*_*rth 33

我是这样做的:

my_array[0..-2]
Run Code Online (Sandbox Code Playgroud)

  • 这很棒。我很困惑为什么会有许多更复杂的答案。这是Ruby的新功能吗? (2认同)

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)

  • 你可以用 `-2` 代替 `-1-1`。 (2认同)
  • 是的,我离开-1-1只是为了解释这个概念 (2认同)
  • 您可以执行“a[0...-1]”(注意第三个点)并获得与“a[0..-1-1]”相同的结果,因为第三个点告诉它排除结束元素。有关更多详细信息,请参阅[此](http://ruby-doc.com/docs/ProgrammingRuby/html/language.html#UE)。 (2认同)

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)

  • 这一举动感觉有点像滑板伎俩 (27认同)

Mik*_*bee 6

你试过"拿"吗

a.take(3) 
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,这是`a.take(a.size - 1)`; 是的,我考虑过这个选项. (5认同)