2016-05-03 4 views
1

Ich wollte eine Methode für Arrays erstellen, um einen Splat des Arrays zurück zu bekommen. Ist das in Ruby möglich?Wie man einen Splat von einer Methode in Ruby zurückgibt

Zum Beispiel hier ist mein aktueller Code: Sie können nicht zurückgeben "Klecks" von Ruby

Array.module_eval do 
    def to_args 
    return *self 
    end 
end 

I [1,2,3].to_args erwarten 1,2,3 zurückzukehren, aber es endet [1,2,3]

+0

Wenn Sie erklärt haben, wie Sie diese Methode verwenden möchten, könnte Ihre Frage klarer sein. –

+1

'1,2,3' ist kein gültiger Wert in Ruby, daher ist nicht klar, was Sie eigentlich wollen. Ein Faden? – Hamms

+0

Alle Ruby-Methoden geben ein Objekt zurück. –

Antwort

6

zurück. Aber Sie können ein Array zurück und es dann selbst vollzuspritzen:

def args 
    [1, 2, 3] 
end 
x, y, z = args 
# x == 1 
# y == 2 
# z == 3 

x, *y = args 
# x == 1 
# y == [2, 3] 

Natürlich, das funktioniert auf jedem Array, so gibt es wirklich keine Notwendigkeit für Affen, der eine to_args Methode in Array Patchen - es geht darum, wie die anrufende Sorge das splat-Operator verwendet:

arr = [1, 2, 3] 
x, y, z = arr 
x, *y = arr 
*x, y = arr 

gleichen Mechanismus arbeitet mit Block Argumente:

arr = [1, 2, 3] 
arr.tap {|x, *y| y == [2, 3]} 

noch anspruchsvollere Nutzung:

arr = [1, [2, 3]] 
x, (y, z) = arr 
0

Nicht genau. Es sieht so aus, als ob Sie versuchen, mehrere Rückgabewerte zu erzwingen (die Frage enthält keine Anwendungsbeispiele). Das zurückgegebene Array self kann jedoch genau das liefern, was Sie benötigen, solange Sie mehrere Rückgabewerte auf der aufrufenden Seite der Gleichung richtig verarbeiten.

Betrachten Sie diese Beispiele:

first, *rest = [1, 2, 3]  # first = 1, rest = [2, 3] 
*rest, last = [1, 2, 3]   # rest = [1, 2], last = 3 
first, *rest, last = [1, 2, 3] # first = 1, rest = [2], last = 3 

Andere als diese, kann ich nicht sehen, eigentlich jede Art und Weise entlang mehrere Werte zu erfassen oder weitergeben, wie Sie vorschlagen. Ich denke, die Antwort auf Ihre Frage, wenn ich sie richtig verstehe, ist alles im Gebrauch des Anrufers.

0

Das Konzept, dass das für mich stellt klar ist, dass obwohl Sie die Rückkehr von mehreren Werten in Ruby, ein Verfahren wirklich nur 1 Objekt zurückgeben kann, simulieren können, so dass die Simulation der mehrere Werte in einem Array up bündelt.

Das Array wird zurückgegeben und Sie können es wie jedes Array dekonstruieren.

def foo 
    [1, 2] 
end 

one, two = foo 
Verwandte Themen