在ruby中返回没有特定元素的数组

时间:2014-07-20 08:17:19

标签: ruby arrays

我在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​​ /添加一个类方法/写几行。

有没有办法以红宝石的方式做到这一点?

4 个答案:

答案 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 }

最终结果是我有一个数据库中多次出现的所有客户电子邮件的列表。