Двойное отрицание гарантирует, что независимо от начального значения, вы всегда получите true
или false
, а не какое-либо загадочное значение.
Это удобно, поскольку позволяет избежать висячих ссылок на объекты, которые вы больше нетребуют или должны различать два типа ложных значений: nil
и false
.
Часто вы увидите методы, написанные так:
def logged_in?
!!@session_user
end
Это вернет true
или false
, и это значение может использоваться для любых целей.Сравните это с этим:
def logged_in?
@session_user
end
В этом случае, если вы сохраняете значение, вы фактически сохраняете весь объект @session_user
, который может быть довольно значительным фрагментом памяти.Эта память не может быть освобождена, пока ваша ссылка на нее не выйдет из области видимости.Поскольку существует только один true
и один false
, сборка мусора не требуется.