Nein, Ruby unterstützt die Rückgabe von zwei Objekten nicht. (Übrigens: Sie geben Objekte zurück, keine Variablen. Genauer gesagt, Sie geben Zeiger auf Objekte zurück.)
Es unterstützt jedoch die parallele Zuweisung. Wenn Sie mehr als ein Objekt auf der rechten Seite einer Aufgabe haben, werden die Objekte in einem Array:
foo = 1, 2, 3
# is the same as
foo = [1, 2, 3]
Wenn Sie mehr als ein "Ziel" (Variablen- oder Setter-Methode) auf der linken Seite einer Zuweisung haben, werden die Variablen an Elemente eines Arrayauf der rechten Seite gebunden :
a, b, c = ary
# is the same as
a = ary[0]
b = ary[1]
c = ary[2]
Wenn die rechte Seite ist nicht ein Array, wird es zu einem mit dem umgewandelten to_aryVerfahren
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]
Und wenn wir die beiden zusammenfügen, bekommen wir das
a, b, c = d, e, f
# is the same as
ary = [d, e, f]
a = ary[0]
b = ary[1]
c = ary[2]
Damit verbunden ist der Splat-Operator auf der linken Seite einer Zuweisung. Es bedeutet "nimm alle übrig gebliebenen Elemente von Arrayauf der rechten Seite":
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
Und zu guter Letzt können parallele Zuweisungen in Klammern verschachtelt werden:
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]
Wenn Sie returnvon einer Methode oder nextoder breakaus einem Block, wird Ruby - dieses Art-of wie die rechte Seite einer Zuweisung behandeln, so
return 1, 2
next 1, 2
break 1, 2
# is the same as
return [1, 2]
next [1, 2]
break [1, 2]
Dies funktioniert übrigens auch in Parameterlisten von Methoden und Blöcken (wobei Methoden strenger und Blöcke weniger streng sind):
def foo(a, (b, c), d) p a, b, c, d end
bar {|a, (b, c), d| p a, b, c, d }
Blöcke, die "weniger streng" sind, machen zum Beispiel die Hash#eachArbeit aus. Es tatsächlich yieldsa einziges Zwei-Element Arrayvon Schlüsseln und Wert in den Block, aber wir in der Regel schreiben
some_hash.each {|k, v| }
anstatt
some_hash.each {|(k, v)| }