Nie, Ruby w rzeczywistości nie obsługuje zwracania dwóch obiektów. (BTW: zwracasz obiekty, nie zmienne. Dokładniej, zwracasz wskaźniki do obiektów.)
Obsługuje jednak równoległe przypisanie. Jeśli masz więcej niż jeden obiekt po stronie prawej cesji, obiekty są zbierane w produkt Array
:
foo = 1, 2, 3
# is the same as
foo = [1, 2, 3]
jeśli masz więcej niż jeden „cel” (metoda zmienna lub setter) po lewej stronie -hand boku zadania, zmienne się zobowiązany do elementów o Array
na prawej stronie:
a, b, c = ary
# is the same as
a = ary[0]
b = ary[1]
c = ary[2]
Jeśli po prawej stronie jest nieArray
, zostanie zamienione na jeden przy użyciu the to_ary
method
a, b, c = not_an_ary
# is the same as
ary = not_an_ary.to_ary
a = ary[0]
b = ary[1]
c = ary[2]
A jeśli umieścić dwa razem, otrzymujemy że
a, b, c = d, e, f
# is the same as
ary = [d, e, f]
a = ary[0]
b = ary[1]
c = ary[2]
związane z tym jest operatorem ikona z lewej strony cesji.To znaczy „wziąć wszystko lewej nad elementów Array
na prawej stronie”:
a, b, *c = ary
# is the same as
a = ary[0]
b = ary[1]
c = ary.drop(2) # i.e. the rest of the Array
i last but not least, zadania równoległe mogą być zagnieżdżone pomocą nawiasów:
a, (b, c), d = ary
# is the same as
a = ary[0]
b, c = ary[1]
d = ary[2]
# which is the same as
a = ary[0]
b = ary[1][0]
c = ary[1][1]
d = ary[2]
Kiedy return
od sposobu lub next
lub break
z bloku lub yield
do bloku, Ruby będzie traktować tego rodzaju-jakby z prawej strony cesji, więc
return 1, 2
next 1, 2
break 1, 2
yield 1, 2
# is the same as
return [1, 2]
next [1, 2]
break [1, 2]
yield [1, 2]
Nawiasem mówiąc, to działa także w listach parametrów metod i bloków (z metody są bardziej rygorystyczne i blokuje mniej rygorystyczne):
def foo(a, (b, c), d) p a, b, c, d end
bar {|a, (b, c), d| p a, b, c, d }
bloki są „mniej ścisły” jest na przykład to, co sprawia, że Hash#each
praca. To faktycznie yield
sa pojedynczy dwuelementowa Array
od klucza i wartości do bloku, ale zwykle napisać
some_hash.each {|k, v| }
zamiast
some_hash.each {|(k, v)| }
Technicznie Ruby nie zwraca dwóch wartości. Może zwrócić jedną tablicę, która z kolei zostanie przypisana do dwóch zmiennych. –