Ruby/Zmienne instancji: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Sblive (dyskusja | edycje)
Szymon wro (dyskusja | edycje)
Linia 1:
== Zmienne instancji ==
 
Zmienna instancji ma nazwę zaczynającą się znakiem <tt>@</tt>, a jej zasięg zasięg ograniczony jest tylko do obiektu wskazywanego przez <tt>self</tt>. Dwa różne obiekty, nawet jeśli należą do tej samej klasy, mogą mieć różne wartości swoich zmiennych instancji. Na zewnątrz obiektu zmienne instancji nie mogą być zmienione, ani nawet odczytane (zmienne instancji w Rubim nigdy nie są publiczne), chyba że za pośrednictwem metod wyraźnie dostarczonych przez programistę (lub instrukcji odczytywania i zapisu atrybutow - <tt>attr_reader</tt> i <tt>attr_writer</tt>). Tak jak zmienne globalne, zmienne instancji mają wartość <tt>nil</tt> dopóki nie zostaną zainicjalizowane.
 
Zmienne instancji nie muszą być zadeklarowane. Wskazuje to na elastyczną strukturę obiektu. W rzeczywistości, każda zmienna instancji jest dynamicznie dołączana do obiektu w czasie pierwszego przypisania jej wartości.
 
<pre>
rubyirb(main):001:0> class TestInst
| irb(main):002:1> def ustaw_a(n)
| irb(main):003:2> @a = n
irb(main):004:2> end
| end
| irb(main):005:1> def ustaw_b(n)
| irb(main):006:2> @b = n
irb(main):007:2> end
| end
irb(main):008:1> end
| end
=> nil
rubyirb(main):009:0> i = TestInst.new
=> #<TestInst:0x836780x2e46770>
rubyirb(main):010:0> i.ustaw_a(2)
=> 2
irb(main):011:0> i
ruby> i
=> #<TestInst:0x836780x2e46770 @a=2>
rubyirb(main):012:0> i.ustaw_b(4)
=> 4
irb(main):013:0> i
ruby> i
=> #<TestInst:0x836780x2e46770 @ab=24, @ba=42>
</pre>
 
Zauważ, że powyższe <tt>i</tt> nie zwraca wartości <tt>@b</tt> dopóki nie zostanie wywołana metoda <tt>ustaw_b</tt>.
 
Wiedzę o zmiennych instancji możemy wykorzystać do udoskonalenia naszej klasy <tt>Zwierze</tt> z [[Ruby/Zmienne klasowe|rozdziału o zmiennych klasowych]]:
 
<source lang="ruby">
class Zwierze
@@ilosc = 0
def initialize(nazwa, wiek)
@nazwa = nazwa
@wiek = wiek
@@ilosc += 1
| end
def self.populacja
puts "Populacja zwierzat liczy sztuk: #{@@ilosc}"
| end
def podaj_nazwe
@nazwa
| end
def podaj_wiek
@wiek
end
def to_s
"Jestem #{@wiek}-letni #{podaj_nazwe}"
end
end
 
pies = Zwierze.new("pies", 3)
kot = Zwierze.new("kot", 5)
 
puts pies #=> Jestem 3-letni pies
puts kot #=> Jestem 5-letni kot
Zwierze.populacja #=> Populacja zwierzat liczy sztuk: 2
</source>
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Zmienne klasowe|poprz=Zmienne klasowe|nastart=Ruby/Zmienne lokalne|nast=Zmienne lokalne}}