Ruby/Zmienne lokalne: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje) Nie podano opisu zmian |
Szymon wro (dyskusja | edycje) Nie podano opisu zmian |
||
Linia 32:
</pre>
Obiekty procedurowe, które żyją w tym pewnym zakresie widoczności współdzielą tylko zmienne lokalne, które również należą do tego zakresu. Tutaj, zmienna lokalna <tt>bar</tt> jest współdzielona przez <tt>main</tt> oraz obiekty procedurowe <tt>p1</tt> i <tt>p2</tt>:
<pre>
ruby> bar=nil
nil
Linia 46 ⟶ 47:
ruby> p2.call
5
</pre>
Zauważ, że "<tt>bar=nil</tt>" na początku nie może zostać pominięte. To przypisanie zapewnia, że zasięg zmiennej <tt>bar</tt> będzie obejmie <tt>p1</tt> i <tt>p2</tt>. Inaczej <tt>p1</tt> i <tt>p2</tt> postawiłyby by swoje własne zmienne lokalne <tt>bar</tt>, i rezultatem wywołania <tt>p2</tt> byłby błąd "undefined local variable or method" (niezdefinowana zmienna lokalna lub metoda). Moglibyśmy użyć <tt>bar=0</tt>, ale użycie <tt>nil</tt> jest pewną uprzejmością wobec tych, którzy będą czytać nasz kod później. Wskazuje to naprawdę jasno że tylko ustanawiamy zakres, ponieważ wartość przypisywana do zmiennej nie jest zawiera żadnego dodatkowego znaczenia.
Potężną zaleta obiektów procedurowych wypływa z ich zdolności do bycia przekazywanymi jako argumenty: współdzielone zmienne lokalne pozostają poprawde nawet wtedy, gdy są przekazane poza pierwotny zakres.
<pre>
ruby> def box
| contents = nil
Linia 66 ⟶ 69:
ruby> reader.call
2
</pre>
Ruby jest szczególnie sprytny jeśli chodzi o zakres. Ewidentnie widać w naszym przykładzie, że zmienna <tt>contents</tt> jest współdzielona pomiędzy <tt>reader</tt> i <tt>writer</tt>. Możemy również wytworzyć wiele par <tt>reader-writer</tt> używając <tt>box</tt> zdefiniowanego powyżej. Każda para współdzieli zmienną <tt>contents</tt>, a pary nie kolidują ze sobą nawzajem.
<pre>
ruby> reader_1, writer_1 = box
[#<Proc:0x40172820>, #<Proc:0x4017280c>]
Linia 79 ⟶ 84:
ruby> reader_2.call # nothing is in this box yet
nil
</pre>
Ten rodzaj programowania mógłby być uważany za lekko perwersyjny zorientowany obiektowo szkielet. Metoda <tt>box</tt> odgrywa rolę klasy podczas gdy <tt>get</tt> i <tt>set</tt> służą jako metody (z wyjątkiem tego, że tak naprawdę nie są nazwami metod, co mogłoby różnić w każdą instancji <tt>box</tt>) natomiast <tt>contents</tt> jest samotną zmienną intancji. Oczywiście stosowanie właściwego szkieletu klas Rubiego prowadzi do znacznie bardziej czytelnego kodu.
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Zmienne instancji|poprz=Zmienne instancji|nastart=Ruby/Stałe klasowe|nast=Stałe klasowe}}
|