Определение метода со знаками равенства в Ruby - PullRequest
1 голос
/ 07 августа 2010

Я пытаюсь создать класс User, который будет хранить только хешированный пароль

class User
  # Password should be stored only as hash in @password_hash,
  # crypted by that function:
  def self.crypt(password)
    # Returns password hash
  end

  # Crypt password and store it in @password_hash
  def password=(str)
    @password_hash = crypt(str)
  end

  # Crypt given password and compare it with stored @password_hash
  def password==(str)
    @password_hash == crypt(str)
  end
end

me = User.new
me.password = 'qwerty'

if me.password == 'qwerty'
  puts 'Ok'
else
  puts 'Error'
end

Но я получаю syntax error, unexpected tEQ, expecting '\n' or ';' на 14 строке

Ответы [ 2 ]

3 голосов
/ 07 августа 2010

Вы не можете определить метод с именем password==. Назначения особенные; Сравнений нет. Если вы действительно хотите использовать синтаксис User.password == "something", вот способ сделать это:

class User
  attr_reader :password
  def password=(str)
    @password = Password.new(str)
  end

  class Password < String
    def encrypt(str)
      "foo" + str # TODO make stronger
    end

    def initialize(str)
      super(encrypt(str))
    end

    def ==(other)
      super(encrypt(other))
    end
  end
end
2 голосов
/ 07 августа 2010

Попробуйте:

def == str
   @password_hash == crypt(str)
end

Также посмотрите на модуль Comparable.

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