首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby boolean双重否定约定

Ruby boolean双重否定约定
EN

Stack Overflow用户
提问于 2011-04-27 05:47:08
回答 2查看 3.9K关注 0票数 16

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

代码语言:javascript
复制
!!(boolean expression)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-27 05:50:07

双重否定确保无论初始值是什么,你都会得到truefalse,而不是一些神秘的值。

这很方便,因为它避免了对不再需要的对象的悬空引用,也避免了必须区分两种类型的False值:nilfalse

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

代码语言:javascript
复制
def logged_in?
  !!@session_user
end

这将返回truefalse,该值可用于所需的任何用途。将其与此进行比较:

代码语言:javascript
复制
def logged_in?
  @session_user
end

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

票数 22
EN

Stack Overflow用户

发布于 2011-04-27 05:55:28

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

代码语言:javascript
复制
class String
  def include? regex; self =~ regex end
end

如果执行上述操作,则在不匹配时返回nil,在匹配时返回一个整数。在许多情况下,这并不重要(nil类似于false,可以用true代替整数)。但是如果你真的想要一个布尔值作为返回值,如果你这样做了

代码语言:javascript
复制
class String
  def include? regex; !!(self =~ regex) end
end

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5796860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档