2010-07-23 27 views
9

Ví dụ sau thất bạiLàm cách nào để lấy đối tượng lớp từ chuỗi "A :: B :: C" trong Ruby?

class A 
    class B 
    end 
end 
p Object.const_get 'A' # => A 
p Object.const_get 'A::B' # => NameError: wrong constant name A::B 

CẬP NHẬT

Các câu hỏi về chủ đề hỏi trước đó:

  1. Cast between String and Classname
  2. Ruby String#to_class
  3. Get a class by name in Ruby?

cuối cùng một gives a nice solution có thể được phát triển thành

class String 
    def to_class 
    self.split('::').inject(Object) do |mod, class_name| 
     mod.const_get(class_name) 
    end 
    end 
end 

class A 
    class B 
    end 
end 
p "A::B".to_class # => A::B 
+0

gì xảy ra nếu tôi muốn tuyên bố sử dụng các phương pháp 'to_class' và gán giá trị của mình cho một' CONSTANT' trong vòng một 'class', ví dụ 'lớp A bắt đầu MY_CONST =" SomeOtherClass ".to_class end'? Tôi nhận được uninitialized liên tục nếu gọi bên ngoài 'initialize' ví dụ. 'class_eval', tôi có thể thử cái gì? Cảm ơn! – Dr1Ku

Trả lời

7

Bạn sẽ phải tự "phân tích" các dấu hai chấm cho mình và gọi const_get trên mô-đun phụ huynh/lớp:

ruby-1.9.1-p378 > class A 
ruby-1.9.1-p378 ?> class B 
ruby-1.9.1-p378 ?> end 
ruby-1.9.1-p378 ?> end 
=> nil 
ruby-1.9.1-p378 > A.const_get 'B' 
=> A::B 

Ai đó đã viết qualified_const_get mà có thể bạn quan tâm.

6

Đây là constantize phương pháp Rails':

def constantize(camel_cased_word) 
    names = camel_cased_word.split('::') 
    names.shift if names.empty? || names.first.empty? 

    constant = Object 
    names.each do |name| 
    constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name) 
    end 
    constant 
end 

Xem, nó bắt đầu tại Object trên đầu trang của nó tất cả, sau đó sử dụng mỗi tên ở giữa các dấu chấm phẩy đôi như một bước đệm để có được hằng số bạn muốn.

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