我正在使用一些使用此语法的代码(restful authentication)。
def logged_in?
!!current_user()
end
尝试谷歌搜索但它似乎忽略“!!”,将接受一个答案,可以告诉我如何找到有关搜索字符串的信息,如!!在谷歌。
答案 0 :(得分:30)
这是双重否定。如果!
不是false
或current_user
,则第一个nil
会将其转换为false
。之后,它将其转换为true
。所以结果总是一个布尔值而不是current_user
的值。如果true
不是current_user
或false
,则结果始终为nil
。否则它是false
。
答案 1 :(得分:8)
这是否定运算符!
,两次。这给出了一个具有相同真值的值,但显然只是一个布尔值。
在Ruby中,有许多值被认为是“真实”(除false
和nil
之外的任何值),还有一些被认为是“假”({{1} }和false
)。第一个否定将所有真值转换为nil
,将所有错误值转换为false
。第二个否定然后反转,给你一个与原始值具有相同真值的值,但只允许实际值true
或true
。
如果您不希望人们使用false
作为访问当前用户的方式,但是您希望它只返回一个布尔值,这会很有用。
它相当于更明确和更详细:
logged_in?
答案 2 :(得分:3)
本文似乎使用相同的代码:
http://toolmantim.com/articles/bangbang_your_nil_is_dead
基本上,看起来它只是意味着两次应用not(!)运算符 - 实际上强制该方法返回true或false而不是true,false或nil。
也就是说,如果@current_user
为零,则调用
def logged_in?
@current_user()
end
将返回nil。将其改为(单发)
def logged_in?
!@current_user()
end
将返回true,并进一步更改为(double bang)
def logged_in?
!!@current_user()
end
将返回false - 这比nil更适用(和可用)。
另一种写作方式是:
def logged_in?
!@current_user().nil?
end
但这并不包括@current_user
为假的情况,我认为!!
更适合查看。
答案 3 :(得分:1)