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