我在我的代码中使用了以下逻辑:
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为Array
、Hash
和String
添加了exclude?
方法。虽然这不是纯Ruby,但被许多Ruby开发者广泛使用。
exclude?(object) → true or false
如果集合中没有与给定对象相等的元素,则返回true
,否则返回false
。例如:[1, 2, 3].exclude?(4) #=> true
[1, 2, 3].exclude?(3) #=> false
注意:该方法依赖于==
方法的实现。 - barnettrequire 'active_support/core_ext/enumerable'
。 - Dennisif flag unless @players.include?(p.name)
很尴尬,而 if flag && !@players.include?(p.name)
使用了否定。 - gabeif
只允许 true
通过条件,但 unless
允许 false
和 nil
通过。这有时会导致难以发现的错误。因此我更喜欢使用 exclude?
。 - ToTenMilan仅考虑Ruby:
简短总结:
使用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(除非)很好用。
如果你对 !
运算符的反感主要是因为它需要放在你的检查前面,这会破坏你的打字流程,那么就可以使用 .!
方法。你只需将其放在检查后面即可反转布尔值:
if @players.include?(p.name).!
使用 unless
:
unless @players.include?(p.name) do
...
end
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}
我为自己查找了这个问题,找到了一个解决方案。人们使用了一些令人困惑的方法,有些方法在特定情况下或根本不起作用。
我知道现在已经太晚了,考虑到这是6年前发布的,但希望未来的访问者能找到这个(并且希望它能整理他们和你的代码)。
简单的解决方案:
if not @players.include?(p.name) do
....
end
not
来替代!
。我已经使用Ruby 15年了,这对我来说是新鲜事。谢谢你的发帖! - Joshua Pinter
do
是有效的 Ruby 代码吗?我得到了一个错误syntax error, unexpected end-of-input
(如果我删除do
,它可以工作)。 - maxymoo