212

我的代码中有以下逻辑:

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

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

理想情况下,此代码段将是:

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

12 回答 12

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

ActiveSupport 将exclude?方法添加到ArrayHashString。这不是纯 Ruby,但很多 Ruby 爱好者都在使用它。

来源:Active Support Core Extensions(Rails 指南)

于 2012-10-31T09:44:58.203 回答
106

干得好:

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

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

于 2012-04-27T17:55:04.070 回答
14

只看红宝石:

TL;博士

使用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
于 2018-04-04T17:59:03.537 回答
13

以下情况如何:

unless @players.include?(p.name)
  ....
end
于 2012-04-27T17:55:32.773 回答
7
module Enumerable
  def does_not_include?(item)
    !include?(item)
  end
end

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

于 2012-04-27T17:56:38.360 回答
3

使用unless

unless @players.include?(p.name) do
  ...
end
于 2012-04-27T17:55:03.200 回答
1

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

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

几天来,我一直在为类似的逻辑苦苦挣扎,在检查了几个论坛和问答板后,发现解决方案实际上非常简单。

于 2017-09-10T14:10:45.957 回答
1

你可以使用:

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

unless是相反的if,或者你可以使用reject.

您可以reject使用不需要的元素:

@players.reject{|x| x==p.name}

获得结果后,您可以进行实施。

于 2018-09-12T04:02:39.947 回答
0

usingunless对于带有单个include?子句的语句很好,但是,例如,当您需要检查一个包含某些内容Array但另一个不包含某些内容时,使用include?withexclude?更友好。

if @players.include? && @spectators.exclude? do
  ....
end

但是正如上面dizzy42所说,使用exclude?需要ActiveSupport

于 2014-01-27T10:35:36.603 回答
0

尝试这样的事情:

@players.include?(p.name) ? false : true
于 2016-07-18T15:45:06.677 回答
0

我正在为自己查找这个,找到这个,然后找到一个解决方案。人们正在使用令人困惑的方法和一些在某些情况下不起作用或根本不起作用的方法。

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

简单的解决方案:

if not @players.include?(p.name) do
  ....
end
于 2018-08-24T18:56:50.733 回答
0

如果您对!-operator 的反对主要是它需要放在您的支票前面,这会破坏您的打字流程,那么就有了.!方法。您只需将其放在检查后以反转布尔值:

if @players.include?(p.name).!
于 2022-02-03T19:06:27.477 回答