【发布时间】:2015-07-06 12:15:37
【问题描述】:
我想得到这样的东西:
a = [0,1,0,0,1,0,1,0]
a.except(1) # => [0,0,0,1,0,1,0]
a # => [0,1,0,0,1,0,1,0]
a.except(1).except(1) # => [0,0,0,0,1,0]
如您所见,a 的第一个元素等于 except 的参数已从 a 中删除。
我能做到:
tmp_a = a.dup
tmp_a.delete_at(a.index(1))
tmp_a
但在我看来,它看起来像气味。有没有更优雅的单线解决方案? (换句话说 - 如何为 Array 定义方法“except”?)
UPD
我解决了这个问题
class Array
def except(elem)
dup.tap{|a| a.delete_at(a.index(elem))}
end
end
你怎么看?
【问题讨论】:
-
写一个封装元素查找和切片的方法。没有理由欺骗数组,只需取值两侧的元素即可。
-
元评论:对我来说,因为误解而无聊的答案似乎很极端——只要评论澄清,用户就会监督他们自己的内容。
-
我没有投反对票,但是,在投反对票按钮的工具提示中提到的投反对票的可能原因之一是“这个问题不清楚”,因此,如果用户觉得问题不清楚,downvoting 完全没问题。即使那个用户碰巧弄错了,也有 410 万其他用户可以投票。
-
这个问题有什么不清楚的地方?
-
Gena,我喜欢你使用
tap,所以修改了我的Array#difference代码(在我的答案中给出的链接)使用tap代替cpy = dup,然后@987654331 @ 作为最后一行。我喜欢这种方法的声音,以至于有时我写obj.tap{}.tap{}.tap { |x| ... }。
标签: ruby