是否有内置方法执行与Array#delete
相同的功能但返回self
?我想这样做而不使用比an_ary.-([el])
更清楚和更清晰的块。
我可以monkeypatch一个,但它看起来像一个“紧凑的参数”方法将是一个相对普遍的愿望?
答案 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
一起很好地使用。那是您不能轻易地减去数组。
&.