Вы должны понимать, что когда вы делаете "def @ user.id", вы на самом деле определяете метод в классе singleton, связанном с объектом @user (класс singleton также известен как "eigenclass" или "shadow class")).То, что вы делаете, эквивалентно этому:
@temp = 4
class << @user
def id
@temp
end
end
Как вы можете видеть выше, @temp внутри определения метода id является обычной переменной экземпляра, но она связана с классом singleton.Другими словами, @temp внутри определения id отличается от @temp снаружи.Вы можете решить эту проблему, непосредственно установив внутреннюю переменную @temp, например:
@user.instance_variable_set(:@temp, 4)
def @user.id
@temp
end
Дайте мне знать, если это поможет, или у вас есть дополнительные вопросы о том, как работает класс синглтона.