2013-07-03 7 views
15

Dla metod w Ruby, czy istnieje coś podobnego do javascriptowego? apply?Styl JavaScript "zastosuj" w Ruby?

Oznacza to, że jeśli zdefiniowano kilka metod, które przyjmują kilka parametrów, powiedzmy, some_method(a, b, c) i mam tablicę trzech elementów, czy mogę zadzwonić pod numer some_method.apply(the_context, my_array_of_three_items)?


EDIT: (aby wyjaśnić pewne niejasności): nie dbają tak bardzo o kontekście rozmowy, po prostu chcę, aby tego uniknąć:

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

zamiast Jestem ciekaw, czy istnieje coś takiego

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

Twoje pytanie wydaje się być bardzo niejednoznaczne. Czy możesz zawęzić to, by wskazać, co chciałbyś osiągnąć? Czy chcesz zmienić kontekst połączenia? Czy chcesz zmienić tablicę na listę argumentów? Czy chcesz wywołać metodę, której nazwa nie jest znana do czasu wykonania? – samuil

Odpowiedz

16

Istnieje bindings które są najbliżej odpowiednikiem javascript kontekście i są unbound methods, które można później powiązać z obiektem, który będzie wywoływany w jego zasięgu.

Wiązania muszą być wcześniejsze niż captured i zezwalają na wpisanie evaluating code z ciągu znaków w jego kontekście.

Unbinding metoda zrobione z jakiegokolwiek przedmiotu z method extractor pozwala później bind go do obiektu (zauważ, że musi dzielić tyle interfejsu dla metody do pracy) i nazwać go w jego zakres.

Jeśli nie zechcesz zhakować w Ruby rzeczy o bardzo niskim poziomie, zniechęciłbym ich do obu powyższych rozwiązań na rzecz rozwiązania obiektowego.


EDIT:

Jeśli chcesz po prostu wywołać metodę, podczas gdy to argumenty zawarte są w tablicy operatora użycie ikona:

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

przybił to. dzięki @samuil –

3

można wywołać metodę, której nazwa jest znana tylko w czas wykonywania metodą send na Class.

Aktualizacja

przekazać argumentów jako tablica:

$ 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

Ale czy argumenty mogą być przekazywane jako tablica? –

+2

Tak, z operatorem splat. Odpowiedź zaktualizowana. –

Powiązane problemy