что значит !! делать в рубине? - PullRequest
10 голосов
/ 13 января 2010

Я использую некоторый код, который использует этот синтаксис (повторная аутентификация).

def logged_in?
  !!current_user()
end

Попробовал поискать в Google, но он, кажется, игнорирует "!!", примет ответ, который может подсказать мне, как найти информацию о поиске таких строк, как !! в гугле.

Ответы [ 4 ]

30 голосов
/ 13 января 2010

Это двойное отрицание. Первый ! преобразует его в false, если current_user не nil или false. После этого он преобразует его в true. Таким образом, результатом всегда является логическое значение, а не значение current_user. Результат всегда true, если current_user не false или nil. В противном случае это false.

8 голосов
/ 13 января 2010

Это оператор отрицания, !, дважды. Это дает значение, которое имеет то же значение истинности, но явно только логическое значение.

В Ruby есть много значений, которые считаются "истинными" (что угодно, кроме false и nil), и пара, которые считаются "ложными" (и false, и nil ). Первое отрицание преобразует все истинные значения в false, а все ложные значения в true. Затем второе отрицание отменяет это, оставляя вам значение, которое имеет то же значение истинности, что и оригинал, но допускает только фактические значения true или false.

Это может быть полезно, если вы не хотите, чтобы люди использовали logged_in? для доступа к текущему пользователю, но вместо этого вы хотите, чтобы он просто возвращал логическое значение.

Это эквивалентно более явному и многословному:

def logged_in?
  if current_user()
    true
  else
    false
  end
end
3 голосов
/ 13 января 2010

В этой статье используется тот же код:

http://toolmantim.com/articles/bangbang_your_nil_is_dead

По сути, похоже, что он просто предназначен для применения оператора not (!) Дважды - по сути, заставляя метод возвращать true или false вместо true, false или nil.

То есть, если @current_user равно нулю, вызывать

def logged_in?
  @current_user()
end

вернет ноль. Изменение его на (одиночный взрыв)

def logged_in?
  !@current_user()
end

вернет истину и изменится на (двойной удар)

def logged_in?
  !!@current_user()
end

вернет false - что более применимо (и применимо), чем ноль.

Другой способ написать это будет:

def logged_in?
  !@current_user().nil?
end

но это не относится к случаю, когда @current_user ложно, и я думаю, что !! приятнее смотреть.

1 голос
/ 13 января 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...