2017-02-28 1 views
1

Szenario: Ein Verfahren nimmt Argumente in dieser WeiseWie übergeben Sie Array-Elemente als separate Methodenargumente in Ruby?

def my_method(model_name, id, attribute_1, attribute_2) 
    # ... 
end 

Alle Parameter nicht bekannt sind, so dass ich den Namen des Modells aus dem Klassennamen des Objekts das Abrufen und die Attribute I aus dieser Klasse am Abholen als Array zurückgegeben.

Problem: Ich habe ein Array ["x", "y", "z"]. Ich muss die Elemente aus jedem Array nehmen und sie nach dem Modell in die Methodenparameter übergeben, wie oben dargestellt.

Ist es sogar möglich, die Klammern sozusagen aus einem Array zu entfernen, aber die Elemente und ihre Reihenfolge im Takt zu halten?

+1

Ohne '*' du könntest einfach 'my_method (model_name, ary [0], ary [1], ary [2])' schreiben, hier kein großes Problem ;-) – Stefan

Antwort

7

ja, benutzen Sie einfach * vor Array:

my_method(model_name, *["x", "y", "z"]) 

es bewirkt:

my_method(model_name, "x", "y", "z") 

* ein splat operator ist.

+0

Es ist ein sehr guter Weg, ich kannte den Splat-Operator vorher nicht;) – Alex

+0

Sie haben mir Stunden der Frustration erspart. –

+0

@Alex ja, ziemlich praktisch. Ich benutze es die ganze Zeit, wenn ich mit CSVs zu tun habe und eine variable Anzahl von Spalten pro Zeile habe –

1

Der einfache Weg ist:

data = ["x", "y", "z"] 
my_method(model_name, data[0], data[1], data[2]) 

Der lange Weg:

data = ["x", "y", "z"] 
id_var = data[0] 
attribute_1 = data[1] 
attribute_2 = data[2] 
my_method(model_name, id_var, attribute_1, attribute_2) 

Aber die beste und klügste Weg derjenige ist, Stefan und Lukasz Muzyka vorgeschlagen:

my_method(model_name, *["x", "y", "z"]) 
+0

Sie könnten auch 'id_var, attribute_1, attribute_2 = data' verwenden, um die Elemente Variablen zuzuordnen. – Stefan

+0

Sie haben Recht, aber vielleicht ist dieser Weg besser lesbar oder leicht zu verstehen – Alex

Verwandte Themen