数组#删除,但返回数组?

时间:2011-04-06 20:16:24

标签: ruby

是否有内置方法执行与Array#delete相同的功能但返回self?我想这样做而不使用比an_ary.-([el])更清楚和更清晰的块。

我可以monkeypatch一个,但它看起来像一个“紧凑的参数”方法将是一个相对普遍的愿望?

7 个答案:

答案 0 :(得分:37)

如果你想改变原始数组,比如delete,可以选择以下选项:

ary.reject!{|e| e==42 }.something_else
ary.tap{|a| a.delete 42}.something_else
(ary.delete 42;ary).something_else
(ary-=[42]).something_else

如果您想要一个新数组链接:

ary.reject{|e| e==42 }.something_else
(ary-[42]).something_else

答案 1 :(得分:4)

array.reject{|element| element == value_of_element_to_be_deleted}

答案 2 :(得分:1)

你可以做到

my_array.first(n) #1

my_array.last(n) #2

如果要删除的数组元素位于数组的末尾(1)或开头(2)。

答案 3 :(得分:1)

我有同样的问题Array#delete_at返回一个数组,其中删除了指定索引处的元素,这就是为什么我最终在这里。看起来它没有内置。如果其他人感兴趣,我很快写了这个猴子补丁(我几乎没有考虑效率,我最初没有处理任何情况,如负指数或越界指数......但后来我决定快速扔掉一对夫妇):

class Array
  def remove_at(i)
    # handle index out of bounds by returning unchanged array
    return self if i >= self.length

    # remove the i-th element from the end if i is negative
    if i < 0
      i += self.length
      # handle index out of bounds by returning unchanged array
      return self if i < 0
    end

    # Return an array composed of the elements before the specified
    # index plus the elements after the specified index
    return self.first(i) + self.last(self.length - i - 1)
  end
end

test = [0,1,2,3,4,5]
puts test.remove_at(3).inspect
puts test.remove_at(5).inspect
puts test.remove_at(6).inspect
puts test.remove_at(-7).inspect
puts test.remove_at(-2).inspect

我很高兴鞭打它,所以我想我也可以在这里发布它:)

答案 4 :(得分:1)

我更喜欢这种方式:

list = [1, 2, 3, 4, 5]
list.tap { |list| list.delete(2) } # => [1, 3, 4, 5]

答案 5 :(得分:0)

an_ary.-([el])看起来很糟糕。

那......

an_ary - [el]

答案 6 :(得分:-1)

OP不喜欢operator>>的外观...但是它确实有很多用途。

是的。。。确实有点丑陋,但是减号方法简明扼要,可以从另一个数组中减去一个数组。

an_ary.-([el])

ary = [1, 2, 99, 3]
ary.-([99])

这里的优点是它可以完全链接(与odds = [1, 3, 5, 7, 9, 99] ary.-(odds) .delete不同),因此您可以执行以下操作:

ary - odds

您的眼睛一旦发现减号,就比ary.-(odds).average .delete_if块结构更容易阅读,理解和视觉识别错别字。

如果您可能得到nil而不是数组,它也可以与Ruby的安全导航运算符.reject一起很好地使用。那是您不能轻易地减去数组。

&.
相关问题