2013-03-07 14 views
9

Bu neden çalışmıyor?Neden "Gönder" Ruby 2.0 düzeltmesiyle başarısız?

module StringRefinement 
    refine String do 
    def bar 
     length 
    end 
    end 
end 

using StringRefinement 
"abcdefghijklmnopqrstuvwxyz".send(:bar) 
#NoMethodError: undefined method 'bar' for "abcdefghijklmnopqrstuvwxyz":String 

Neden birisi send burada çalışmıyor? Ve bir arıtmada tanımlanan yöntemleri dinamik olarak çağırmanın bir yolu var mı? Ruby 2.0'da ayrıntılandırmanın nasıl çalıştığına dair iyi ve eksiksiz bir açıklama bulamıyorum. "Bu tasarım gereğidir" ifadesini kullanıyorum.

+1

Bu deneysel mi? – texasbruce

+0

@oldergod Gerçekten mi? Sadece yukarıdaki kodu kopyalayıp doğrudan gözetleyerek ve aynı hatayı alıp tekrar denedim. Ayrıca 2.0.0-p0 kullanıyorum. Gönderdiğim şeyi yaptığınızdan emin misiniz? –

+0

@SeanMackesey haklısın, benim kötü. – oldergod

cevap

9

öyle diyor:

Dolaylı yöntem

yöntem araması sırasında arayan bağlamında refinements onurlandırmak etmeyecektir böyle Kernel#send, Kernel#method ve Kernel#respond_to? gibi herhangi dolaylı yöntem erişim erişir.

+0

ile bağlantılı olabilir. Jorg. Neden biliyor musun? –

0

Ancak yine it's quite possible this design is not entirely stable. Örneğin, module ve class kapsam belirleme özelliği yalnızca birkaç ay önce removed olmuştur. Doğru,

eval "puts 'abcdefghijklmnopqrstuvwxyz'.bar" # => 26 

Ama gerçekten, bu laboratuardan içindir: hatta Yakut HEAD anda

tek yolu bütün kötülüklerin kökünü kullanmaktır? Böyle bir kodu çıkarmayın, yavru kedi ölür. the specification Çünkü

İlgili konular