我的代码中有以下逻辑:
if !@players.include?(p.name)
...
end
@players
是一个数组。有没有方法可以避免!
?
理想情况下,此代码段为:
if @players.does_not_include?(p.name)
...
end
答案 0 :(得分:318)
if @players.exclude?(p.name)
...
end
ActiveSupport将exclude?
方法添加到Array
,Hash
和String
。这不是纯Ruby,但是被很多rubyists使用。
答案 1 :(得分:83)
答案 2 :(得分:11)
以下内容如何:
unless @players.include?(p.name)
....
end
答案 3 :(得分:7)
<强> 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