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 Array
auf 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_ary
Verfahren
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 Array
auf 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 return
von einer Methode oder next
oder break
aus 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#each
Arbeit aus. Es tatsächlich yield
sa einziges Zwei-Element Array
von Schlüsseln und Wert in den Block, aber wir in der Regel schreiben
some_hash.each {|k, v| }
anstatt
some_hash.each {|(k, v)| }