我的代码中包含以下逻辑:
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
Answers:
if @players.exclude?(p.name)
...
end
的ActiveSupport增加的exclude?
方法Array
,Hash
和String
。这不是纯Ruby,而是许多红宝石主义者使用的。
require 'active_support/core_ext/enumerable'
if flag unless @players.include?(p.name)
笨拙并且if flag && !@players.include?(p.name)
使用否定。
if
只true
通过条件时,unless
让false
和通过nil
。有时这会导致难以发现错误。因此,我更喜欢exclude?
怎么样:
unless @players.include?(p.name)
....
end
仅查看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
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
好的,但是说真的,除非工作正常。
unless
可以显示摘要,但条件可能更复杂。我认为使用这些否定的方法很方便,它们允许使用更具声明性的代码。
用途unless
:
unless @players.include?(p.name) do
...
end
使用unless
具有单个include?
子句的语句是很好的选择,但是,例如,当您需要检查某个内容中是否包含某些内容Array
而不是另一内容中的内容时,include?
with 的使用exclude?
要友好得多。
if @players.include? && @spectators.exclude? do
....
end
但是正如dizzy42所说,使用exclude?
ActiveSupport需要
do
有效的红宝石吗?我收到错误消息syntax error, unexpected end-of-input
(如果我删除,则可以工作do
)