2013-07-03 10 views
15

Per i metodi in Ruby, c'è qualcosa di simile allo apply di javascript?JavaScript in stile `apply` in Ruby?

Cioè, se alcuni metodi sono stati definiti per prendere alcuni parametri, ad esempio, some_method(a, b, c) e ho una matrice di tre elementi, posso chiamare some_method.apply(the_context, my_array_of_three_items)?


EDIT: (per chiarire una certa confusione): Non mi interessa tanto il contesto della chiamata, voglio solo evitare questo:

my_params = [1, 2, 3] 
some_method(my_params[0], my_params[1], my_params[2]) 

, invece, sono curioso di sapere se c'è qualcosa di simile

my_params = [1, 2, 3] 
some_method.apply(my_params) 
+2

La tua domanda sembra essere molto ambiguo. Potresti affinarlo per indicare cosa vorresti realizzare? Vuoi cambiare contesto di chiamata? Vuoi cambiare array in elenco di argomenti? Vuoi chiamare il metodo il cui nome non è noto fino al runtime? – samuil

risposta

16

ci sono bindings che sono più vicini omologo di javascript contesto, e ci sono unbound methods che possono essere successivamente associati all'oggetto da chiamare nel suo ambito.

I binding devono essere precedenti a captured e consentono evaluating code da string nel proprio contesto.

Unbinding metodo catturato da qualsiasi oggetto con method extractor consente di seguito bind a un oggetto (si noti che si deve condividere abbastanza di interfaccia per il metodo di lavorare) e chiamarlo nel suo campo di applicazione.

A meno che non vogliate hackerare alcune cose di livello molto basso in Ruby, scoraggeremo l'uso di entrambi sopra in favore della soluzione orientata agli oggetti.


EDIT:

Se si vuole semplicemente chiamare il metodo, mentre è argomenti sono contenuti in serie operator uso splat:

a = [1, 2, 3] 
method(*a) 
+1

inchiodato. grazie @samuil –

3

è possibile richiamare un metodo il cui nome è noto solo a run-time con il metodo send su Class.

Aggiornamento

per passare gli argomenti come un array:

$ irb 
2.0.0p195 :001 > class Foo 
2.0.0p195 :002?> def bar(a, b, c) 
2.0.0p195 :003?>  puts "bar called with #{a} #{b} #{c}" 
2.0.0p195 :004?>  end 
2.0.0p195 :005?> end 
=> nil 
2.0.0p195 :006 > foo = Foo.new 
=> #<Foo:0x000000022206a8> 
2.0.0p195 :007 > foo.bar(1, 2, "fred") 
bar called with 1 2 fred 
=> nil 
2.0.0p195 :009 > foo.send(:bar, *[1, 2, "jane"]) 
bar called with 1 2 jane 
=> nil 
2.0.0p195 :010 > 
+0

Ma gli argomenti possono essere passati come una matrice? –

+2

Sì, con l'operatore splat. Risposta aggiornata –

Problemi correlati