什么! 意思是ruby?

只是想知道什么!! 在Ruby中。

不是。 它用于将值转换为布尔值:

 !!nil #=> false !!"abc" #=> true !!false #=> false 

尽pipe通常没有必要使用Ruby,但是对Ruby的唯一的错误值是nil ,所以最好让这个约定成立。

把它想成是

 !(!some_val) 

有一件事情是合法使用的是防止大量的数据被返回。 例如,你可能不想在你的has_image?返回3MB的图像数据has_image? 方法,或者你可能不想在logged_in?返回你的整个用户对象logged_in? 方法。 使用!! 将这些对象转换为简单的true / false

如果右边的对象不是nil而不是false ,则返回true如果是nilfalse ,则返回false

 def logged_in? !!@current_user end 

! 意味着否定布尔状态,两个! 除了双重否定之外,没有什么特别的。

 !true == false # => true 

它通常用来强制一个方法返回一个布尔值。 它会检测任何种类的真实性,如string,整数和什么不是,并把它变成一个布尔值。

 !"wtf" # => false !!"wtf" # => true 

一个更真实的用例:

 def title "I return a string." end def title_exists? !!title end 

当你想要确保返回一个布尔值时,这很有用。 恕我直言,这是一种毫无意义,虽然,看到, if 'some string'if trueif true是完全相同的stream量,但有些人觉得显式返回一个布尔值是有用的。

请注意,这种习语还存在于其他编程语言中。 C没有内在的booltypes,所以所有的布尔types都是int ,而规范值为01 。 采取这个例子(为了清楚起见,添加括号):

 !(1234) == 0 !(0) == 1 !(!(1234)) == 1 

“not-not”语法将任何非零整数转换为1 ,规范的布尔真值。

但总的来说,我认为比起使用这个不常见的习惯用法来说,要好一些:

 int x = 1234; if (!!x); // wtf mate if (x != 0); // obvious 

这是有用的,如果你需要做一个独家或 。 从马特·范·霍恩的回答中稍作修改复制:

 1 ^ true TypeError: can't convert true into Integer !!1 ^ !!true => false 

我用它来确保两个variables都是零,或两者都不是零。

 raise "Inconsistency" if !!a ^ !!b 

这是“双重否定”,但是这种做法令人沮丧。 如果您使用的是rubocop ,您会发现它违反了Style/DoubleNegation违规的代码。

理由说明:

由于这是隐晦的,通常是多余的,所以应该避免[then paraphrasing:]把!!something改成!something.nil?

理解它是如何工作的,如果你需要将一个枚举转换成一个布尔值,那么它是非常有用的。 我有这样的代码,使用classy_enum gem:

 class LinkStatus < ClassyEnum::Base def ! return true end end class LinkStatus::No < LinkStatus end class LinkStatus::Claimed < LinkStatus def ! return false end end class LinkStatus::Confirmed < LinkStatus def ! return false end end class LinkStatus::Denied < LinkStatus end 

然后在服务代码,我有,例如:

 raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states. 

有效地,bangbang运算符已经成为我可能写成的方法,称为to_bool。