代码之家  ›  专栏  ›  技术社区  ›  Peter

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

  •  122
  • Peter  · 技术社区  · 15 年前

    假设我有一个Ruby数组

    a = [1, 2, 3, 4]
    

    如果除了第一项以外我都想要,我可以写 a.drop(1) 最后的 不过,我只能这样想

    a[0..-2]   # or
    a[0...-1]
    

    drop . 我还缺少其他的内在方式吗?

    14 回复  |  直到 15 年前
        1
  •  138
  •   DigitalRoss    8 年前

    可能

    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]
    
        2
  •  98
  •   Mirko Froehlich    15 年前

    a[0...-1] ? 您希望获得数组的切片,因此切片操作符似乎是惯用的选择。

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

    class Array
        def drop_last
            self[0...-1]
        end
    end
    
        3
  •  61
  •   montrealmike    11 年前

    >> *a, b = [1,2,3]
    => [1, 2, 3]
    >> a
    => [1, 2]
    >> b
    => 3
    
        4
  •  46
  •   kogitoja    10 年前

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

    > arr = [1, 2, 3, 4, 5]
    > arr.pop
    => 5
    > arr
    => [1, 2, 3, 4]
    > arr.tap(&:pop)
    => [1, 2, 3]
    
        5
  •  44
  •   Andy Ali    9 年前

    my_array[0..-2]
    
        6
  •  25
  •   axelarge    13 年前

    比如像这样扩展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]
    
        7
  •  19
  •   dbr    15 年前

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

    a.pop :

    >> a = [1, 2, 3, 4]
    >> a.pop
    >> a
    => [1, 2, 3]
    
        8
  •  13
  •   boulder_ruby    8 年前

    删除一行中的最后一个元素,其余元素返回

    [1, 2, 4, 5, 6].reverse.drop(1).reverse
    

    [1,2,3,4][0..-2]
    #=> [1,2,3]
    
        9
  •  11
  •   Fran Martinez    10 年前

    这是一种方式:

    [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]
    

    这是你需要的。下一个示例将返回记录 从0位到最后1位

    a[0..-1-1]
    => [1, 2, 3, 4]
    
        10
  •  7
  •   Mike Buckbee    15 年前

    a.take(3) 
    
        11
  •  2
  •   weakish    10 年前

    答复: a.τwτ ,但您必须安装 Pyper 第一

    派珀简介: 你认识莉西吗 car cdr 返回数组的“第一个”和“其余”吗?为了满足您这样的需求,我对这个Lispy机制进行了扩展。它叫 pyper ,它还允许您访问第二个,第二个,第三个,第三个,第三个,第三个,第三个,除了最后一个之外的所有内容。这些内容不太好写,但它还允许字母合成,就像 caar , cadr , 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

    a.τwmbτ #=> ["o", "p", "o", "i"] (second letters of all-except-last array)
    

    但目前其他命令字符太热门,不太容易使用。

        12
  •  1
  •   alegscogs    11 年前

    ary2 = ary.dup
    ary2.pop
    

        13
  •  1
  •   Soumya    10 年前

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

        14
  •  -1
  •   George Lucas    10 年前
    a = [1,2,3,4]
    
    a[0..(a.length - 2)]
    => [1,2,3]