Nie, Ruby w rzeczywistości nie obsługuje zwracania dwóch obiektów. (BTW: zwracasz obiekty, a nie zmienne. Dokładniej, zwracasz wskaźniki do obiektów).
Obsługuje jednak przypisywanie równoległe. Jeśli masz więcej niż jeden obiekt po prawej stronie przydziału, obiekty są gromadzone w Array:
foo = 1, 2, 3
foo = [1, 2, 3]
Jeśli masz więcej niż jeden „cel” (zmienna lub metoda ustawiająca) po lewej stronie przypisania, zmienne zostaną powiązane z elementami Arraypo prawej stronie:
a, b, c = ary
a = ary[0]
b = ary[1]
c = ary[2]
Jeśli prawa strona nie jest ikoną Array, zostanie przekonwertowana na jedną przy użyciu to_arymetody
a, b, c = not_an_ary
ary = not_an_ary.to_ary
a = ary[0]
b = ary[1]
c = ary[2]
A jeśli połączymy te dwa elementy, otrzymamy to
a, b, c = d, e, f
ary = [d, e, f]
a = ary[0]
b = ary[1]
c = ary[2]
Związany z tym jest operator splat po lewej stronie przydziału. To znaczy „weź wszystkie lewe elementy z Arrayprawej strony”:
a, b, *c = ary
a = ary[0]
b = ary[1]
c = ary.drop(2)
I wreszcie, równoległe przypisania można zagnieżdżać za pomocą nawiasów:
a, (b, c), d = ary
a = ary[0]
b, c = ary[1]
d = ary[2]
a = ary[0]
b = ary[1][0]
c = ary[1][1]
d = ary[2]
Kiedy ci returnod sposobu lub nextlub breakz bloku, Ruby będzie traktować tego rodzaju, jakby z prawej strony cesji, więc
return 1, 2
next 1, 2
break 1, 2
return [1, 2]
next [1, 2]
break [1, 2]
Nawiasem mówiąc, działa to również w przypadku list parametrów metod i bloków (metody są bardziej rygorystyczne, a bloki mniej rygorystyczne):
def foo(a, (b, c), d) p a, b, c, d end
bar {|a, (b, c), d| p a, b, c, d }
Na przykład bloki są „mniej rygorystyczne” Hash#each. To faktycznie yieldsa pojedyncze dwuelementowa Arrayklucza i wartości do bloku, ale zazwyczaj zapisu
some_hash.each {|k, v| }
zamiast
some_hash.each {|(k, v)| }