Class instance variables - трябва ми просветление

  1. Как мога да достъпя класова инстанционна променлива в инстанционен метод на наследник? По-точно, как и къде трябва да си дефинирам променливата?

    Възможно ли е изобщо да стане това, което искам тук?

    class Parent
      # ...
      @sacred_var    # No idea where and how to define it! :(
      # ...
    end
    
    class Child < Parent
      def method_of_child
        # I want to change @sacred_var here
      end
    end
    
    Parent.sacred_var   # a value
    child = Child.new
    child.method_of_child
    Parent.sacred_var   # changed value
    
  2. Класът и инстанцията му са различни обекти. Ще перефразирам въпроса ти:

    Как може да се достъпи инстанционна променилва на един обект от метод на друг обект?

    class Baba
      # Код...
    
      def initialize
        @baba = 'a'
      end
    end
    
    class Dyado
      def initialize
        @other = Baba.new
      end
    
      def test
        # Как да достъпя @baba тук?
      end
    end
    

    Отговори на горния въпрос и ще си отговориш на твоя въпрос. Чакам отговор :)

  3. Относно примера на Петър ако sacred_var е класова променлива тогава няма ли да стане точно това коетп той иска? В смисъл класовата променлива за parent не е ли е същата и за child? Виждам че примера който е дал би проработил ако sacred_var е @@

  4. @Георги, ще стане чрез метод - класов метод на Baba. :D (Дано не съм най-тежкия ви случай...)

    @Лазар, класовите променливи ми вършат идеална работа, но са забранени - опитах се да напиша решение с тях, но сайтът отказа да го приеме. Затова използвам класова инстанционна променлива - тя е дефинирана като инстанционна променлива на обекта, представляващ класа. Така мога да напиша Parent.sacred_var без да пиша никъде @@sacred_var.

  5. class Parent
       class << self
         attr_accessor :sacred_var 
       end
       @sacred_var = 1
    end
    
    class Child < Parent
      def method_of_child
        # I want to change @sacred_var here:
        Parent.instance_eval { @sacred_var = 'new_value'}
      end
    end
    
    Parent.sacred_var #=> 1
    Child.sacred_var #=> nil
    Child.new.method_of_child #smenqme @sacred_var za Parent
    
    Parent.sacred_var #=> 'new_value'
    Parent.instance_variable_get("@sacred_var") #=> 'new_value' 
    
  6. @Георги, ще стане чрез метод - класов метод на Baba. :D (Дано не съм най-тежкия ви случай...)

    Точно така. Защо тогава не използваш класов метод за достъпването и в твоя пример? :)

    Класът и инстанцията му са различни обекти. Имат различни инстанционни променливи. instance_eval не ви трябва - не се хвърляйте на сложното.

    @Лазар - в твоя пример вместо Parent.instance_eval { @sacred_var = 'new_value'} можеш да имаш Child.sacred_var = 'new_value' :)

  7. @Георги, аз също го мислех това ама аз видях че той в примера си чрез обект на Child променя sacred_var за Parent. А с Child.sacred_var = 'new_value' ще имам че Child.sacred_var #=> 'new_value' , ама Parent.sacred_value май ще остане пак със старата стойност ?

Трябва да сте влезли в системата, за да може да отговаряте на теми.