Metaprogramowanie

Zaczynam uczyc sie rubiego i trafilem na sytuacje, ktora nie jest dla mnie do konca jasna. Czy ktos z forumowiczow moglby mnie uswiadomic (;

[code]class Obj
def something
puts “calling simple”
@abc = 1
def something
print "calling memoized "
@abc
end
something
end
end

o = Obj.new
p = Obj.new

puts “o #{o.something}”
puts “o #{o.something}”
puts “p #{p.something}” ###
puts “o #{o.something}”[/code]
Uswiadomienie ma polegac na wytlumaczeniu faktu dlaczego zaznaczona linia (###) ma taki a nie inny output. Dlaczego metoda nie zwraca @abc dla obiektu p? Z gory dziekuje za pomoc (:

Jedno wywołanie Object#something nadpisało metodę something dla obiektów klasy Object. Nowa metoda something już nie definiuje @abc, więc obiekty inne niż o (które “zdążyły” mieć @abc zdefiniowane przez “starą” wersję metody) nie mają tej zmiennej instancyjnej zdefiniowanej.

Możesz sobie dla poprawienia zrozumienia powyższego akapitu spróbować tego kodu z jedną dopisaną linijką:

class Obj def something puts "calling simple" @abc = 1 def something print "calling memoized " @abc = 2 unless @abc @abc end something end end
Po odpaleniu powinno nastąpić oświecenie :wink:

Nastąpiło (: ale…

Chodziło Ci o Obj? (Rzeczywiście, mogłem dać lepszą nazwę)

Sorry, mój błąd. Automatycznie skojarzyłem z rubiowym Object.