是否包含相反的内容?对于Ruby Arrays?

时间:2012-04-27 17:51:25

标签: ruby-on-rails ruby

我的代码中有以下逻辑:

if !@players.include?(p.name)
  ...
end

@players是一个数组。有没有方法可以避免!

理想情况下,此代码段为:

if @players.does_not_include?(p.name)
  ...
end

10 个答案:

答案 0 :(得分:318)

if @players.exclude?(p.name)
    ...
end

ActiveSupport将exclude?方法添加到ArrayHashString。这不是纯Ruby,但是被很多rubyists使用。

来源:Active Support Core Extensions (Rails Guides)

答案 1 :(得分:83)

你走了:

unless @players.include?(p.name)
  ...
end

您可以查看Ruby Style Guide了解有关类似技术的更多信息。

答案 2 :(得分:11)

以下内容如何:

unless @players.include?(p.name)
  ....
end

答案 3 :(得分:7)

仅查看Ruby

<强> TL; DR

使用none?==块传递给它进行比较:

[1, 2].include?(1)
  #=> true
[1, 2].none? { |n| 1 == n  }
  #=> false

<强>阵列#包括吗

Array#include?接受一个参数并使用==来检查数组中的每个元素:

player = [1, 2, 3]
player.include?(1)
 #=> true

<强>可枚举#无吗

Enumerable#none?也可以接受一个参数,在这种情况下,它使用===进行比较。为了得到include?的反对行为,我们省略了参数,并使用==将其传递给一个块进行比较。

player.none? { |n| 7 == n }
 #=> true 
!player.include?(7)    #notice the '!'
 #=> true

要考虑的要点

在上面的例子中,我们实际上可以使用:

player.none?(7)
 #=> true

这是因为Integer#==Integer#===是等价的。但请考虑:

player.include?(Integer)
 #=> false
player.none?(Integer)
 #=> false

none?返回false,因为Integer === 1 #=> true。但真正合法的notinclude?方法应该返回true。正如我们之前所做的那样:

player.none? { |e| Integer == e  }
 #=> true

答案 4 :(得分:6)

module Enumerable
  def does_not_include?(item)
    !include?(item)
  end
end

好的,但是说真的,除非工作正常。

答案 5 :(得分:2)

使用除非。

unless @players.include?(p.name) do
  ...
end

答案 6 :(得分:0)

使用unless适用于包含单个include?子句的语句,但是,例如,当您需要检查包含某个Array但不包含在另一个include?中的内容时,使用exclude?if @players.include? && @spectators.exclude? do .... end 相比更加友好。

exclude?

但正如dizzy42所述,使用{{1}}需要ActiveSupport

答案 7 :(得分:0)

尝试这样的事情:

@players.include?(p.name) ? false : true

答案 8 :(得分:0)

试试这个,它是纯Ruby,所以不需要添加任何外围框架

if @players.include?(p.name) == false do 
  ...
end

我在类似的逻辑上苦苦挣扎了几天,在检查了几个论坛和Q&amp; A板后几乎没有用,事实证明解决方案实际上非常简单。

答案 9 :(得分:0)

我一直在为自己查找,找到并找到解决方案。人们正在使用令人困惑的方法,以及某些在某些情况下根本无法使用或根本无法使用的方法。

考虑到这是6年前发布的,我知道现在为时已晚,但希望将来的访问者能找到它(并希望它可以清理他们的代码以及您的代码。)

简单的解决方案:

if not @players.include?(p.name) do
  ....
end