Antworten:
def sumdiff(x, y)
return x+y, x-y
end
#=> nil
sumdiff(3, 4)
#=> [7, -1]
a = sumdiff(3,4)
#=> [7, -1]
a
#=> [7, -1]
a,b=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1
a,b,c=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1
c
#=> nil
def foo_and_bar; ['foo', 'bar']; end
Ruby hat eine begrenzte Form der Destrukturierungsbindung:
ary = [1, 2, 3, 4]
a, b, c = ary
p a # => 1
p b # => 2
p c # => 3
a, b, *c = ary
p c # => [3, 4]
a, b, c, d, e = ary
p d # => 4
p e # => nil
Es hat auch eine begrenzte Form der Strukturierung binden:
a = 1, 2, 3
p a # => [1, 2, 3]
Sie können diese beiden Formen folgendermaßen kombinieren:
a, b = b, a # Nice way to swap two variables
a, b = 1, 2, 3
p b # => 2
def foo; return 1, 2 end
a, b = foo
p a # => 1
p b # => 2
Es gibt verschiedene andere Dinge, die Sie mit der Destrukturierung / Strukturierung von Bindungen tun können. Ich habe nicht mit dem splat-Operator ( *
) auf der rechten Seite gezeigt. Ich habe keine Verschachtelung gezeigt (mit Klammern). Ich habe nicht gezeigt, dass Sie Destructuring Bind in der Parameterliste eines Blocks oder einer Methode verwenden können.
Hier ist nur eine Vorspeise:
def foo(((a, b, c, d), e, *f), g, *h)
local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end
end
foo([[1, 2, 3], 4, 5, 6], 7, 8, 9)
# a => 1
# b => 2
# c => 3
# d => nil
# e => 4
# f => [5, 6]
# g => 7
# h => [8, 9]
Obwohl die Rückgabe mehrerer Werte oft nützlich ist, finde ich sie normalerweise als Zeiger auf eine neue Objektanforderung.
Das heißt, ich finde normalerweise, dass diese Rückgabewerte in Bedeutung / Kontext eng miteinander verbunden sind und als solche weitergegeben werden. In diesen Fällen würde ich also ein neues Objekt erstellen, um diese zusammenzubinden. Es ist ein bestimmter Code-Geruch, den ich zu erkennen gelernt habe.
chunk
würden solche Dinge nicht existieren. Ausgezeichnetes Prinzip. Code riecht tatsächlich. Mach weiter.
>>
Aufforderung von irb verursachte Verrücktheit verschwindet .