Ruby boolean double negation约定

Ham*_*ish 16 ruby

谁能告诉我为什么很多Ruby布尔方法都使用这种双重否定约定?

!!(boolean expression)
Run Code Online (Sandbox Code Playgroud)

tad*_*man 22

双重否定确保无论初始值如何,您总是会得到true或者false永远不会有一些神秘的价值.

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

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

def logged_in?
  !!@session_user
end
Run Code Online (Sandbox Code Playgroud)

这将返回truefalse该值可用于任何需要的目的.与此相比:

def logged_in?
  @session_user
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您保存该值,您实际上是在保存整个@session_user对象,这可能是一个相当重要的内存块.在您对它的引用超出范围之前,无法释放此内存.由于只有一个true和一个false,所以不需要垃圾收集.