2013-03-07 44 views
9

Tại sao tính năng này không hoạt động?Tại sao `gửi` thất bại với tinh chỉnh Ruby 2.0?

module StringRefinement 
    refine String do 
    def bar 
     length 
    end 
    end 
end 

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

Ai đó có thể giải thích lý do tại sao send không hoạt động ở đây? Và có cách nào để tự động gọi các phương thức được xác định trong sàng lọc không? Tôi dường như không thể tìm thấy một giải thích tốt, đầy đủ về cách tinh chỉnh hoạt động trong Ruby 2.0.

+1

Vì thử nghiệm? – texasbruce

+0

@oldergod Thật sao? Tôi chỉ thử lại bằng cách sao chép và dán mã ở trên trực tiếp vào nâng lên và nhận được lỗi chính xác tương tự. Tôi cũng đang sử dụng 2.0.0-p0. Bạn có chắc bạn đang làm chính xác những gì tôi đã đăng không? –

+0

@SeanMackesey bạn đúng, xấu của tôi. – oldergod

Trả lời

9

the specification nói như vậy:

phương pháp gián tiếp truy cập

Bất kỳ truy cập phương pháp gián tiếp như Kernel#send, Kernel#method, và Kernel#respond_to? không được tôn trọng cải tiến trong bối cảnh người gọi trong khi tra cứu phương pháp.

+0

Cảm ơn bạn đã làm rõ rằng Jorg. Bạn có biết tại sao? –

0

Tôi muốn nói "Đây là theo thiết kế". Nhưng lại một lần nữa it's quite possible this design is not entirely stable. Ví dụ: tính năng phạm vi moduleclass phạm vi đã là removed chỉ một vài tháng trước.

Tại thời điểm thậm chí trên Ruby ĐẦU cách duy nhất là sử dụng thư mục gốc của mọi điều ác:

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

Nhưng thực sự, đây là chỉ dành riêng cho các phòng thí nghiệm, phải không? Không unchain mã như vậy, con mèo con sẽ chết.

Các vấn đề liên quan