Переменные экземпляра в ActiveSupport :: Concern - PullRequest
0 голосов
/ 27 февраля 2019

Я прочитал, что модули (в данном случае ActiveSupport :: Concern) в ruby ​​являются общими для всех экземпляров инициализированного класса.Поэтому, если бы это было правдой, это означало бы, что любые переменные экземпляра были бы общими для всех экземпляров в памяти.

module SetPassword
  extend ActiveSupport::Concern
  attr_reader :password
  def password=(new_password)
    @password = new_password
    self.crypted_password = password_digest(new_password, salt)
  end
end

class User
  include SetPassword
end

u = User.new; u.password = 'abcdef'
u2 = User.new; u2.password = '123456'

Безопасен ли приведенный выше код для использования?Или второй пользователь переопределит первого?

1 Ответ

0 голосов
/ 27 февраля 2019

Module#include находится под капотом, вызывая Module#append_features.Это означает, что ничто не является общим, и это можно легко проверить (ActiveSupport::Concern не имеет никакого отношения к коду, который вы проверяете.)

module SetPassword
  attr_reader :password
  def password=(new_password)
    @password = new_password
    puts <<~EOS
    Setting password to: #{@password} (id: #{@password.__id__}).
    Object: #{self.class.name} (#{self.__id__}).
    Method: #{__callee__} on #{self.method(__callee__).__id__}.
    EOS
  end 
end

class User
  include SetPassword
end

u1 = User.new; u1.password = 'abcdef'
u2 = User.new; u2.password = '123456'

Приведенный выше код демонстрирует, что все(сам пароль, переменная экземпляра и даже сам метод) отличается:

▶ u1 = User.new; u1.password = 'abcdef'
#⇒ Setting password to: abcdef (id: 46968741459360).
#  Object: User (46968741459420).
#  Method: password= on 46968741459040.

▶ u2 = User.new; u2.password = '123456'
#⇒ Setting password to: 123456 (id: 46968734231740).
#  Object: User (46968734232020).
#  Method: password= on 46968734230640.
...