有人能告诉我为什么很多Ruby boolean方法使用这种双重否定约定吗?
!!(boolean expression)
发布于 2011-04-27 05:50:07
双重否定确保无论初始值是什么,你都会得到true
或false
,而不是一些神秘的值。
这很方便,因为它避免了对不再需要的对象的悬空引用,也避免了必须区分两种类型的False值:nil
和false
。
您经常会看到这样编写的方法:
def logged_in?
!!@session_user
end
这将返回true
或false
,该值可用于所需的任何用途。将其与此进行比较:
def logged_in?
@session_user
end
在这种情况下,如果保存该值,实际上是保存了整个@session_user
对象,这可能是相当大的内存块。在您对此内存的引用超出范围之前,无法释放此内存。因为只有一个true
和一个false
,所以不需要垃圾收集。
发布于 2011-04-27 05:55:28
假设您想定义一个返回布尔值的方法。例如,字符串是否与正则表达式匹配。
class String
def include? regex; self =~ regex end
end
如果执行上述操作,则在不匹配时返回nil
,在匹配时返回一个整数。在许多情况下,这并不重要(nil
类似于false
,可以用true
代替整数)。但是如果你真的想要一个布尔值作为返回值,如果你这样做了
class String
def include? regex; !!(self =~ regex) end
end
匹配时返回true
,不匹配时返回false
。
https://stackoverflow.com/questions/5796860
复制相似问题