什么! 意思是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
如果是nil
或false
,则返回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 true
是if true
是完全相同的stream量,但有些人觉得显式返回一个布尔值是有用的。
请注意,这种习语还存在于其他编程语言中。 C没有内在的bool
types,所以所有的布尔types都是int
,而规范值为0
或1
。 采取这个例子(为了清楚起见,添加括号):
!(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。