我在http://www.ruby-doc.org/core-2.1.2/Array.html看起来非常努力,但我找不到这种行为的快速功能:
arr = [1,2,3,4,5,6]
arr.without(3,6) #=> [1,2,4,5]
我知道我可以编写自己的函数/ monkey-patch ruby /添加一个类方法/写几行。
有没有办法以红宝石的方式做到这一点?
答案 0 :(得分:7)
你可以使用减法:
arr - [3,6]
修改强>
如果你真的想要你可以为这个方法添加别名
class Array
alias except -
end
然后你可以使用:
arr.except [3,6]
答案 1 :(得分:2)
使用reject
还有另一种方式。但它并不比-
arr.reject{|x| [3,6].include? x}
答案 2 :(得分:2)
这在Rails 5中添加了:)
https://github.com/rails/rails/issues/19082
module Enumerable
def without(*elements)
reject { |element| element.in?(elements) }
end
end
它只是美学,但它对大脑有意义
答案 3 :(得分:0)
以防万一其他人遇到这种情况,并正在寻找一种基于条件从数组中删除元素的方法:可以使用delete_if。
例如,我有一个客户列表,想要合并所有有重复电子邮件的客户。查询完所有电子邮件的列表以及每个电子邮件的总数后,我可以删除所有只出现一次的电子邮件:
emails = Customer.select('count(email) as num_emails, email').group('email')
emails.delete_if { |email| email.num_emails.to_i == 1 }
最终结果是我有一个数据库中多次出现的所有客户电子邮件的列表。