什么!! 做红宝石?

Jim*_*Jim 10 ruby ruby-on-rails

我正在使用一些使用此语法的代码(restful authentication).

def logged_in?
  !!current_user()
end
Run Code Online (Sandbox Code Playgroud)

尝试谷歌搜索,但它似乎忽略"!!",将接受一个答案,可以告诉我如何找到有关搜索字符串的信息,如!! 在谷歌.

Tom*_*kas 30

这是双重否定.第一个!转换为falseif ,如果current_user不是nilfalse.之后,它将其转换为true.所以结果总是一个布尔值而不是值current_user.结果总是true如果current_user不是falsenil.不然吧false.

  • 例如,将其转换一个truthy或falsey值转换成真正布尔值(truthy => TRUE;,falsey =>`FALSE`).另请参阅此问题:http://stackoverflow.com/questions/1310344 (7认同)

Bri*_*ell 8

它是否定运算符!,两次.这给出了一个具有相同真值的值,但显然只是一个布尔值.

在Ruby中,有一些被认为是"真"(任何除了许多价值观falsenil),并且被认为是一对夫妇是"假"(包括falsenil).第一个否定将所有真值转换为false,并将所有假值转换为true.第二个否定然后反转,给你一个与原始值具有相同真值的值,但只允许实际值truefalse.

如果您不希望人们logged_in?用作访问当前用户的方式,而是希望它只返回一个布尔值,这会很有用.

它等同于更明确和更详细:

def logged_in?
  if current_user()
    true
  else
    false
  end
end
Run Code Online (Sandbox Code Playgroud)