2009-05-07 41 views
57

Tôi có một mô-đun MyModule. Tôi tự động tải các lớp học vào nó. Làm thế nào tôi có thể nhận được một danh sách các lớp được định nghĩa trong không gian tên của nó?Tìm các lớp học có sẵn trong Học phần

Ví dụ:

def load_plugins 
    Dir.glob(File.dirname(__FILE__) + '/plugins/*.rb') do |f| 
    MyModule.class_eval File.read(f) 
    end 

    # now how can I find the new classes I've loaded into MyModule? 
end 

tôi nên nói rằng mỗi f chứa một cái gì đó giống như "class Foo; kết thúc".

Bạn cũng có thể nghĩ về nó như thế này: trong Rails, làm thế nào tôi có thể lập trình tìm tất cả các lớp được xác định trong mô-đun ActiveRecord?

Trả lời

98

Các lớp học được truy cập thông qua các hằng số. Các lớp được định nghĩa trong một mô-đun được liệt kê dưới dạng hằng số trong mô-đun đó. Vì vậy, bạn chỉ cần chọn các hằng số tham chiếu đến các lớp.

MyModule.constants.select {|c| MyModule.const_get(c).is_a? Class} 
+1

Tuyệt vời. Cảm ơn. – joshuaxls

+7

Một điều: tại sao bạn sử dụng thử nghiệm đó thay vì "MyModule.const_get (c) .is_a? Class"? Tôi không quen với việc sử dụng "===" như thế. – joshuaxls

+3

Không có lý do thuyết phục. Phiên bản === chỉ dễ đọc hơn cho tôi. Sử dụng is_a? cũng sẽ hoạt động tốt. – Chuck

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