Ruby为什么经常使用布尔双重否定约定?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

为什么很多Ruby布尔方法使用这种双重否定约定?

!!(boolean expression)
提问于
用户回答回答于

双重否定确保无论初始值如何,您总能获得truefalse从未获得某种神秘价值。

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

通常你会看到像这样写的方法:

def logged_in?
  !!@session_user
end

这将返回,true或者false该值可以用于任何需要的目的。与此比较:

def logged_in?
  @session_user
end

在这种情况下,如果保存该值,则实际上是保存了整个@session_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时返回,当它不匹配时会返回。

扫码关注云+社区