什么!!做红宝石?

时间:2010-01-13 17:19:07

标签: ruby-on-rails ruby

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

def logged_in?
  !!current_user()
end

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

4 个答案:

答案 0 :(得分:30)

这是双重否定。如果!不是falsecurrent_user,则第一个nil会将其转换为false。之后,它将其转换为true。所以结果总是一个布尔值而不是current_user的值。如果true不是current_userfalse,则结果始终为nil。否则它是false

答案 1 :(得分:8)

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

在Ruby中,有许多值被认为是“真实”(除falsenil之外的任何值),还有一些被认为是“假”({{1} }和false)。第一个否定将所有真值转换为nil,将所有错误值转换为false。第二个否定然后反转,给你一个与原始值具有相同真值的值,但只允许实际值truetrue

如果您不希望人们使用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)