117 Stimmen

Rückgabe von zwei und mehr Werten aus einer Methode

Gibt es eine Möglichkeit, mehrere Werte aus der Methode zurückzugeben? Etwas wie dies:

def someMethod()
  return ["a", 10, SomeObject.new]
end

[a, b, c] = someMethod

169voto

Aditya Mukherji Punkte 8875
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

0 Stimmen

Sie sollten eine Code-Formatierung verwenden, keine Textformatierung. Richten Sie die Zeilen um vier Leerzeichen ein, und die von irb verursachten Ungereimtheiten >> Aufforderung verschwindet.

5 Stimmen

Da eine explizite Rückgabe in Ruby als unidiomatisch gilt, können Sie auch eine implizite Rückgabe verwenden, indem Sie die Rückgabewerte explizit in eine Liste eintragen: def foo_and_bar; ['foo', 'bar']; end

45voto

Jörg W Mittag Punkte 349574

Ruby hat eine begrenzte Form der Destrukturierung von bind:

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

Sie hat auch eine begrenzte Form der Strukturierungsbindung:

 a = 1, 2, 3
 p a # => [1, 2, 3]

Sie können diese beiden Formulare 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 noch einige andere Dinge, die Sie mit der Destrukturierung/Strukturierung der Bindung tun können. Ich habe nicht gezeigt, wie man den Splat-Operator ( * ) auf der rechten Seite. Ich habe die Verschachtelung (mit Paranthesen) nicht gezeigt. Ich habe nicht gezeigt, dass Sie die Destrukturierungsbindung in der Parameterliste eines Blocks oder einer Methode verwenden können.

Das ist nur ein kleiner Vorgeschmack:

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]

17voto

Brian Agnew Punkte 260470

Während die Rückgabe mehrerer Werte oft nützlich ist, finde ich es in der Regel ein Zeiger auf ein neues Objekt Anforderung.

Das heißt, ich stelle in der Regel fest, dass diese Rückgabewerte in ihrer Bedeutung/ihrem Kontext eng miteinander verbunden sind und als solche weitergegeben werden. In diesen Fällen würde ich also ein neues Objekt erstellen, um diese miteinander zu verbinden. Das ist ein besonderer Codegeruch, den ich zu erkennen gelernt habe.

4 Stimmen

Mehr Freiheit, mehr Verantwortung. Erfahrene Rubyisten würden dies ausnutzen und einige schöne Codes schreiben, während Ruby-Neulinge alles schlechter machen können.

1 Stimmen

Das ist offensichtlich nicht immer der Fall, denn sonst würden Dinge wie chunk würde nicht existieren. Aber ein ausgezeichnetes Prinzip. Codegeruch in der Tat. Rock on.

8voto

Zack Xu Punkte 10857

Sie können dies auch erreichen, indem Sie ein Array zurückgeben, wie

def sumdiff(x, y)
    [x+y, x-y]
end

was funktional äquivalent erscheint zu

def sumdiff(x, y)
    return x+y, x-y
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X