我的代码中有以下逻辑:
if !@players.include?(p.name)
...
end
@players
是一个数组。有没有一种方法可以避免!
?
理想情况下,此代码段将是:
if @players.does_not_include?(p.name)
...
end
我的代码中有以下逻辑:
if !@players.include?(p.name)
...
end
@players
是一个数组。有没有一种方法可以避免!
?
理想情况下,此代码段将是:
if @players.does_not_include?(p.name)
...
end
if @players.exclude?(p.name)
...
end
ActiveSupport 将exclude?
方法添加到Array
、Hash
和String
。这不是纯 Ruby,但很多 Ruby 爱好者都在使用它。
只看红宝石:
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
以下情况如何:
unless @players.include?(p.name)
....
end
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
好的,但说真的,除非工作正常。
使用unless
:
unless @players.include?(p.name) do
...
end
试试这个,它是纯 Ruby,所以不需要添加任何外围框架
if @players.include?(p.name) == false do
...
end
几天来,我一直在为类似的逻辑苦苦挣扎,在检查了几个论坛和问答板后,发现解决方案实际上非常简单。
你可以使用:
unless @players.include?(p.name) do
...
end
unless
是相反的if
,或者你可以使用reject
.
您可以reject
使用不需要的元素:
@players.reject{|x| x==p.name}
获得结果后,您可以进行实施。
usingunless
对于带有单个include?
子句的语句很好,但是,例如,当您需要检查一个包含某些内容Array
但另一个不包含某些内容时,使用include?
withexclude?
更友好。
if @players.include? && @spectators.exclude? do
....
end
但是正如上面dizzy42所说,使用exclude?
需要ActiveSupport
尝试这样的事情:
@players.include?(p.name) ? false : true
我正在为自己查找这个,找到这个,然后找到一个解决方案。人们正在使用令人困惑的方法和一些在某些情况下不起作用或根本不起作用的方法。
我知道现在为时已晚,考虑到这是 6 年前发布的,但希望未来的访问者能找到这个(希望它可以清理他们和你的代码。)
简单的解决方案:
if not @players.include?(p.name) do
....
end
如果您对!
-operator 的反对主要是它需要放在您的支票前面,这会破坏您的打字流程,那么就有了.!
方法。您只需将其放在检查后以反转布尔值:
if @players.include?(p.name).!