Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby布尔双重否定约定_Ruby - Fatal编程技术网

Ruby布尔双重否定约定

Ruby布尔双重否定约定,ruby,Ruby,有人能告诉我为什么很多Ruby布尔方法使用这种双重否定约定吗 !!(boolean expression) 双重否定确保无论初始值是多少,您都会得到true或false,而不会得到一些神秘值 这很方便,因为它避免了对不再需要的对象的悬空引用,或者必须区分两种类型的假值,nil和false 通常您会看到这样编写的方法: def logged_in? !!@session_user end 这将返回true或false,该值可用于任何需要的用途。与此进行比较: def logged_in?

有人能告诉我为什么很多Ruby布尔方法使用这种双重否定约定吗

!!(boolean expression)

双重否定确保无论初始值是多少,您都会得到
true
false
,而不会得到一些神秘值

这很方便,因为它避免了对不再需要的对象的悬空引用,或者必须区分两种类型的假值,
nil
false

通常您会看到这样编写的方法:

def logged_in?
  !!@session_user
end
这将返回
true
false
,该值可用于任何需要的用途。与此进行比较:

def logged_in?
  @session_user
end

在本例中,如果保存值,实际上是保存整个
@session\u user
对象,这可能是相当大的内存块。在对该内存的引用超出范围之前,无法释放该内存。由于只有一个
true
和一个
false
,因此不需要进行垃圾收集。

假设您要定义一个返回布尔值的方法。例如,字符串是否与正则表达式匹配

class String
  def include? regex; self =~ regex end
end
如果执行上述操作,当不匹配时,它将返回
nil
,当匹配时,它将返回一个整数。在许多情况下,这并不重要(
nil
类似于
false
true
可以替换为整数)。但是如果你真的想要一个布尔值作为返回值,如果你想要的话

class String
  def include? regex; !!(self =~ regex) end
end

匹配时它将返回
true
,不匹配时返回
false

在我看来,Ruby对布尔运算有点太聪明了。这是一种解决聪明导致问题的方法

这里是过度的聪明:没有布尔类。相反,有一个约定,根据该约定,任何值都可以用作布尔值。在需要真值或假值的上下文中,
nil
false
表示“假”,其他任何内容表示“真”。值
true
false
不是特殊类的一部分,它们是各自类的唯一成员-它们的存在只是为了使代码更具可读性


我想这在大多数情况下都很好,但每隔很长一段时间,您就需要一个布尔值,它总是
true
false
。例如,我最近需要比较两个布尔值,如果它们不同,我需要做一些特殊的事情;唯一的问题是,其中一个是
true
false
,而另一个是1或
nil
。修理利用以下事实:
!!nil==false
!!1==true

不是rubyst,但我可以想象将值强制为boolean?密切相关: