Использование переменных экземпляра & self.variable - PullRequest
1 голос
/ 02 марта 2012

Рубиновый камень BCrypt содержит пример использования одного из его модулей.Взято из документов:

def password
  @password ||= Password.new(self.password_hash)
end

def password=(new_password)
  @password = Password.create(new_password)
  self.password_hash = @password
end

Зачем вообще использовать переменную экземпляра @password, когда у нас есть атрибут self.password_hash?Я чувствую, что что-то упустил, вероятно, из-за моей неопытности с рубином.Лично я бы выполнил то, что считаю тем же:

def password
  self.password_hash ||= Password.new(self.password_hash)
end

def password=(new_password)
  self.password_hash = Password.create(new_password)
end

1 Ответ

2 голосов
/ 02 марта 2012

Разница в следующем: хэш пароля - это строка - хэш пароля.Однако Password.new(self.password_hash) создает новый объект класса Password.Таким образом, разница: String против Password.Вы можете вызывать такие методы, как cost, version и т. Д. Для объекта Password, которые недоступны для String.

Полагаю, вы находите следующий метод странным:

def password=(new_password)
  @password = Password.create(new_password)
  self.password_hash = @password
end

, но здесь происходит не совсем очевидное преобразование объекта Password в String объект в self.password_hash assignment - метод to_s возвращает хэш пароля, и это значение сохраняется в базе данных.Более того - переменная экземпляра @password установлена, поэтому метод password будет возвращать экземпляр класса Password, а не хэш пароля String.

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