2010-01-10 33 views
12

Tôi đang cố gắng để tìm ra cách để tự động tạo ra các phương phápcủa Ruby phương pháp class_eval

class MyClass 
    def initialize(dynamic_methods) 
    @arr = Array.new(dynamic_methods) 
    @arr.each { |m| 
     self.class.class_eval do 
     def m(*value) 
      puts value 
     end 
     end 
    } 
    end 
end 

tmp = MyClass.new ['method1', 'method2', 'method3'] 

Đáng tiếc là điều này chỉ tạo ra các phương pháp m nhưng tôi cần phải tạo ra các phương pháp dựa trên giá trị của m, ý tưởng?

Trả lời

27

Có hai cách được chấp nhận:

  1. Sử dụng define_method:

    @arr.each do |method| 
        self.class.class_eval do 
        define_method method do |*arguments| 
         puts arguments 
        end 
        end 
    end 
    
  2. Sử dụng class_eval với một đối số chuỗi:

    @arr.each do |method| 
        self.class.class_eval <<-EVAL 
        def #{method}(*arguments) 
         puts arguments 
        end 
        EVAL 
    end 
    

Tùy chọn đầu tiên chuyển đổi một đóng cửa thành một phương thức, tùy chọn thứ hai sẽ đánh giá một chuỗi (heredoc) và sử dụng ràng buộc phương thức thông thường. Tùy chọn thứ hai có một lợi thế hiệu suất rất nhỏ khi gọi các phương thức. Tùy chọn đầu tiên là (cho là) ​​một chút dễ đọc hơn.

+0

Cảm ơn, chính xác những gì tôi cần" – Bob

+0

Bạn có thể muốn lưu ý rằng bạn cần phải cẩn thận hơn về phương pháp thứ hai, ví dụ: tránh mã như https://github.com/rails/rails/blob/f1d8f2af72e21d41efd02488f1c2dcf829e17783/actionpack/lib/action_dispatch/routing/route_set.rb#L188-200 –

4
define_method(m) do |*values| 
    puts value 
end 
+0

Tuyệt vời, hoạt động nhưng làm cách nào để chỉ định giá trị làm thông số tùy chọn? – Bob

+0

Oh chỉ cần thêm một "*" vào nó như vậy? define_method (m) do | * value | – Bob

+1

Phải (Tôi vừa chỉnh sửa nó cho hiệu ứng đó). Lưu ý rằng mặc dù '* giá trị' không có nghĩa là" giá trị là một đối số tùy chọn ". Nó có nghĩa là "giá trị là một mảng chứa tất cả các đối số (trong số đó có thể có một số tùy ý). – sepp2k

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