2010-08-26 38 views

Trả lời

17

Bạn có thể sử dụng:

Object.const_get(class_name) 

$ irb 
>> class Person 
>>  def name 
>>   "Person instance" 
>>  end 
>> end 
=> nil 
>> class_name = "Person" 
=> "Person" 
>> Object.const_get(class_name).new.name 
=> "Person instance" 
+1

Cảm ơn @OscarRyz và @Magnar này đang làm việc một cách hoàn hảo – Rohit

1

Hãy thử:

Kernel.const_get "Text" 

Đối với module định nghĩa của riêng bạn:

MyModule.const_get "Text" 
3

Hãy thử điều này.

Object.const_get("String") 

Nội dung "Văn bản" sẽ được chuyển thành phụ thuộc vào mã của bạn. Nếu nó trở lại với một mô-đun, thì Văn bản là một mô-đun, bởi vì bạn không thể có cả một mô-đun và một lớp có cùng tên. Có thể có một lớp Văn bản trong một mô-đun khác mà bạn muốn nói đến? Thật khó để nói nhiều hơn mà không cần biết thêm về mã của bạn.

2
classname = "Text" 
Object.const_set(classname, Class.new{def hello;"Hello"; end}) 

t = Object.const_get(classname).new 
puts t.hello # => Hello 

Bí quyết được giải thích ở đây: http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html nơi tác giả sử dụng nó để phân lớp StandardError.

+0

gì nếu lớp đã được xác định ở một nơi khác. Người dùng nhập vào một chuỗi và theo chuỗi đó bạn phải khởi tạo lớp thích hợp. Kiểm tra câu trả lời của @OscarRyz nó mang lại cho tôi giải pháp hoàn hảo. Cảm ơn. – Rohit

1

này sẽ trả về một đối tượng mới của lớp classname:

eval(classname).new

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