2013-07-03 18 views
15

Ruby'deki yöntemler için, javascript'in apply benzeri bir şey var mı?Javascript stili 'geçerlidir'?

Bazı yöntemlerin tanımlanması için bazı yöntemler tanımlanmışsa, yani some_method(a, b, c) ve üç öğeden oluşan bir dizim varsa, some_method.apply(the_context, my_array_of_three_items) numaralı telefonu arayabilir miyim?


DÜZENLEME: (bazı karışıklığı temizlemek için): Ben çağrısı bağlamında hakkında çok umurumda değil, sadece bu kaçınmak istiyorum: yerine

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

, Ben,

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

Sorunuz çok belirsiz gibi görünüyor. Neyi başarmak istediğinizi işaret etmek için onu geliştirebilir misiniz? Çağrı bağlamını değiştirmek ister misiniz? Diziyi argümanların listesine dönüştürmek ister misiniz? Çalışma zamanına kadar hangi ismin bilinmediği yöntemini çağırmak ister misiniz? – samuil

cevap

16

javascript bağlamda en yakın muadili olan bindings vardır böyle bir şey varsa merak ediyorum ve daha sonra kapsamına çağrılacak nesneye bağlı olabilen unbound methods vardır.

Bağlamalar daha önce captured olmalıdır ve içeriğinde dizeden evaluating code'a izin vermelidir. method extractor ile herhangi bir nesneden yakalanan

Unbinding yöntem ve kapsam bulunuyor kimseyi arama (Bu yöntemin çalışması için bir arayüz yeterince paylaşması gerekir unutmayın) daha sonra bind bir nesneye olanak tanır.

Ruby'de çok düşük seviyedeki bazı şeyleri hacklemek istemezseniz, yukarıdakilerin her ikisini de nesne yönelimli çözüm lehine kullanmaya cesaret kırmayacağım.


DÜZENLEME:

sadece o argümanlar dizisi kullanımı uyarısı operatörü içinde bulunan iken, yöntemini çağırmak isterseniz:

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

bunu çiviledi. teşekkürler @samuil –

3

Sen, ismi bilinen bir yöntemi çağırabilirsiniz Class numaralı telefondan send yöntemiyle çalışma zamanı.

Güncelleme bir dizi olarak argümanlar geçmesi için:

$ 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

Ama argümanlar bir dizi olarak iletilebilir mi? –

+2

Evet, uyarıcı ile. Cevap güncellendi. –