[英]What does !! mean in ruby?
只是想知道什么!!
在 Ruby 中。
不是这样的。 它用于将值转换为布尔值:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
但通常没有必要使用,因为 Ruby 的唯一错误值是nil
和false
,因此通常最好让该约定成立。
把它想象成
!(!some_val)
它合法使用的一件事是防止返回大量数据。 例如,您可能不想在您的has_image?
返回 3MB 的图像数据has_image?
方法,或者您可能不想在logged_in?
返回整个用户对象logged_in?
方法。 使用!!
将这些对象转换为简单的true
/ false
。
它返回true
,如果右边的对象不是nil
,而不是false
, false
,如果它是nil
或false
def logged_in?
!!@current_user
end
!
意味着否定布尔状态,两个!
s 没有什么特别的,除了双重否定。
!true == false
# => true
它通常用于强制方法返回布尔值。 它将检测任何类型的真实性,例如字符串、整数和其他类型,并将其转换为布尔值。
!"wtf"
# => false
!!"wtf"
# => true
一个更真实的用例:
def title
"I return a string."
end
def title_exists?
!!title
end
当您想确保返回布尔值时,这很有用。 恕我直言,这有点毫无意义,但看到if 'some string'
和if true
是完全相同的流程,但有些人发现显式返回布尔值很有用。
请注意,此习语也存在于其他编程语言中。 C 没有固有的bool
类型,因此所有布尔值都被输入为int
类型,规范值为0
或1
。 以这个例子为例(为了清楚起见添加了括号):
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
“not-not”语法将任何非零整数转换为1
,即规范的布尔真值。
不过,总的来说,我发现进行合理的比较比使用这个不常见的习语要好得多:
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
如果您需要执行独占或. 复制马特范霍恩的答案,稍作修改:
1 ^ true
TypeError: can't convert true into Integer
!!1 ^ !!true
=> false
我用它来确保两个变量要么都是 nil,要么都不是 nil。
raise "Inconsistency" if !!a ^ !!b
如果您需要将枚举转换为布尔值,了解它的工作原理会很有用。 我有使用classy_enum
gem 做到这一点的代码:
class LinkStatus < ClassyEnum::Base
def !
return true
end
end
class LinkStatus::No < LinkStatus
end
class LinkStatus::Claimed < LinkStatus
def !
return false
end
end
class LinkStatus::Confirmed < LinkStatus
def !
return false
end
end
class LinkStatus::Denied < LinkStatus
end
然后在我的服务代码中,例如:
raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states.
实际上,bangbang 运算符已成为我本来可以编写为名为 to_bool 的方法的内容。
其他答案都讨论了什么!!
是否以及它是否是好的做法。
但是,没有一个答案给出将值转换为布尔值的“标准 Ruby 方式”。
true & variable
TrueClass
是 Ruby 值true
的类,它实现了一个方法&
,其记录如下:
如果
obj
为nil
或false
,则返回false
,否则返回true
。
当标准库已经覆盖时,为什么要使用肮脏的双重否定?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.