谁能告诉我为什么很多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)
这将返回true或false该值可用于任何需要的目的.与此相比:
def logged_in?
@session_user
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果您保存该值,您实际上是在保存整个@session_user对象,这可能是一个相当重要的内存块.在您对它的引用超出范围之前,无法释放此内存.由于只有一个true和一个false,所以不需要垃圾收集.