2012-04-15 15 views
0

Gibt es call_user_func_array() analog in Ruby? Und wie wäre es mit der Klasse create from string, die den Klassennamen enthält? Ich fand nur mit „eval“ ...Ruby :: analog von call_user_func_array()

+0

Es hilft, wenn Sie Dokumentation zu den entsprechenden Link . Nicht jeder Rubyist kennt PHP. –

+0

Gibt es auch ein bestimmtes Problem, das Sie lösen möchten? Oder fragst du dich? –

+1

Ein bisschen mehr Kontext würde helfen. Normalerweise würden Sie einen Proc übergeben und 'proc.call (...)' verwenden oder einen Block übergeben und ihm nachgeben. Klingt so, als ob Sie versuchen, PHP in Ruby zu transkribieren, und das funktioniert selten. –

Antwort

1

Wenn Sie eine dynamische Methode Namen nennen, verwenden send:

user.send("method_#{i}") 

Dies, wenn i = 1 die method_1 auf user Objekt aufrufen.

Ruby verwendet die Terminologie "ein Objekt sendet eine Nachricht an ein anderes Objekt" anstatt "ruft eine Methode/Funktion auf".

+0

Ich würde das als letzten Ausweg bezeichnen. – Reactormonk

+0

@Tass Ich habe alle Arten von Wahnsinn gesehen, wenn es um Metaprogrammierung in Ruby geht (basierend auf einer Proc's Arity in einem DSL zum Beispiel), ich glaube nicht wirklich, dass das zu schlecht ist. –

+0

Ich brauche Klasse von String auch nicht nur Methode. –

0

eine Funktion von str mit Argumenten von Array a bereitgestellt gegeben nennen:

obj.send str, *a 

Sie sind richtig misstrauisch eval zu sein. In Ruby gibt es fast immer einen besseren Weg. Um eine Klasse-Objekt mit einer Zeichenfolge abzurufen, verwenden:

Kernel.const_get str 

So zum Beispiel:

> class A; end 
> Kernel.const_get('A').class 
=> Class 
> Kernel.const_get('A').new 
=> #<A:0x100360ac8> 

Ich sollte hinzufügen, dass es normalerweise nicht in Ruby notwendig sein, eine Klasse auf die Jagd nach basiert auf einem System String, der seinen konstanten Namen enthält. In Ruby Klassen sind reale Objekte, so dass man sie direkt in Sammlungen speichern, ordnen sie Konstanten und Variablen, usw., schließlich eine Klasse-Methode aufrufen, wie #new mit:

(some expression).new