Ruby/Metody: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Szymon wro (dyskusja | edycje)
Linia 73:
To co tradycyjnie nazwalibyśmy wywołaniem funkcji jest po prostu skróconą formą zapisu wywołań metod przez <tt>self</tt>. To właśnie czyni z Rubiego czysto obiektowy język programowania. Ponadto metody funkcyjne nadal zachowują się całkiem podobnie do funkcji w innych językach programowania. Jest to pewna korzyść dla tych, którzy nie rozumieją, że w Rubim wywołania funkcji są tak naprawdę w wywołaniami metod obiektów. Jeśli chcemy, możemy traktować funkcje tak jakby nie były one naprawdę metodami obiektów.
 
W [[Ruby/Zmienne klasowe|rozdziale]] dotyczącym zmiennych klasowych zobaczysz zastosowanie słowa kluczowego <tt>self</tt> przy definiowaniu metod należących do całej klasy, czyli metod ''klasowych''. Ale najpierw przejdźmy do klas.
 
=== Wiele wartości w instrukcji <tt>return</tt> ===
 
Domyślnie metoda zwraca ostatnie obliczone wyrażenie. Można również użyć słowa kluczowego <tt>return</tt> aby metoda zwróciła konkretną wartość. Jednak w Rubim, w odróżnieniu od C/C++, Javy czy C# instrukcja <tt>return</tt> może zwracać więcej niż jedną wartość. Rozważmy taki przykład:
 
<pre>
def metoda
return "a", 0, "b"
end
 
tab = metoda
t1, t2 = metoda
 
puts tab.class # => Array
puts t1.class # => String
puts t2.class # => Fixnum
</pre>
 
Jak widzimy, jeżeli użyjemy jednej zmiennej metoda zwróci nam tablicę, w której będą wszystkie wartości wyrażeń przekazanych do instrukcji <tt>return</tt>. Jeżeli po lewej stronie przypisania wyniku metody umieścimy więcej niż jedną zmienną (<tt>t1</tt>, <tt>t2</tt>, itd.) będą do nich podstawione kolejne wartości zwracane przez <tt>return</tt>. Jeżeli zmiennych po lewej stronie będzie mniej niż wartości zwracanych przez metodę, "nadmiarowe" ''wartości'' zostaną zignorowane (jak ma to miejsce wyżej). Jeżeli natomiast będzie ich więcej, "nadmiarowe" ''zmienne'' dostaną wartości <tt>nil</tt>:
 
<pre>
a1,a2, a3, a4 = metoda
puts a4.nil? # => true
</pre>
<noinclude>
{{Przypisy}}