Что делает эта строка кода Rails? - PullRequest
1 голос
/ 14 сентября 2010
def role?(role)
    return !!self.roles.find_by_name(role.to_s.camelize)
end

Можете ли вы помочь мне понять, что происходит в коде выше? Я новичок в Rails / Ruby.

Спасибо

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

Оператор отрицания (!) повторяется дважды.

Обратите внимание, что только объекты ruby, имеющие значение false (в логическом выражении), являются nil и false.

Следовательно,

  1. some_role будет истинным, !some_role ложным и !!some_role снова истинным.
  2. nil ложным, !nil - это истина, а !!nil - это ложь.

Таким образом, это «умный» способ проверить, равна ли роль, возвращаемая из find_by_name, нулю или нет.(И, следовательно, существует ли роль с таким именем или нет)

Полагаю, мне не нужно говорить вам, что это плохо для удобства чтения.Вы всегда можете проверить, равен ли результат нулю обычными средствами, такими как result.nil? или result == nil.

1 голос
/ 23 марта 2011

Это более читабельно. Не нужно «я» или «возвращение». 'подарок?' противоположность "ноль?" поэтому отрицание не требуется.

def role?(role)
  roles.find_by_name(role.to_s.camelize).present?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...