Как метод класса (внутри модуля) может обновить переменную экземпляра? - PullRequest
1 голос
/ 03 августа 2010

Как метод класса (внутри модуля) может обновить переменную экземпляра?Рассмотрим код ниже:

module Test

  def self.included(klass)
    klass.extend ClassMethods
  end

  module ClassMethods

    def update_instance_variable
     @temp = "It won't work, bc we are calling this on the class, not on the instance."
     puts "How can I update the instance variable from here??"
    end

  end

end


class MyClass
  include Test
  attr_accessor :temp
  update_instance_variable

end

m = MyClass.new # => How can I update the instance variable from here??
puts m.temp     # => nil

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Вам нужно передать экземпляр вашего объекта методу класса в качестве параметра, а затем вернуть обновленный объект из метода.

0 голосов
/ 08 сентября 2010

Это не имеет смысла.Вы используете метод инициализации для установки значений по умолчанию.

class MyClass
  attr_accessor :temp

  def initialize
    @temp = "initial value"
  end

end

Метод инициализации автоматически запускается для вас при создании нового объекта.Когда выполняется объявление класса, экземпляров класса еще нет и быть не может.

Если вы хотите изменить значения по умолчанию позже, вы можете сделать что-то вроде этого:

class MyClass
  attr_accessor :temp

  @@default_temp = "initial value"

  def initialize
    @temp = @@default_temp 
  end

  def self.update_temp_default value
    @@default_temp = value
  end

end

a = MyClass.new
puts a.temp
MyClass.update_temp_default "hej"
b = MyClass.new
puts b.temp

print

initial value
hej

Если вы также хотите изменить переменные уже созданных экземпляров, вам понадобится дополнительная магия.Пожалуйста, объясните, что именно вы хотите достичь.Вы, вероятно, делаете это неправильно:)

...