2010-03-02 46 views
53

Cách chuyển đổi chuỗi thành User?Làm thế nào để chuyển đổi một chuỗi thành một hằng số trong Ruby?

+0

Bạn đang cố gắng để gọi một hàm biến? – harbichidian

+1

Tôi cũng muốn có câu trả lời cho câu hỏi này; Tuy nhiên, bạn đang cố gắng tạo ra một hằng số mới dựa trên một chuỗi, hoặc tìm một hằng số đã được khởi tạo? Ngoài ra, bạn đang tìm kiếm ruby ​​vani hay Rails? – onebree

Trả lời

61

Bạn có thể sử dụng phương thức Module#const_get. Ví dụ:

irb(main):001:0> ARGV 
=> [] 
irb(main):002:0> Kernel.const_get "ARGV" 
=> [] 
25

Nếu bạn có ActiveSupport nạp (ví dụ trong Rails), bạn có thể sử dụng

"User".constantize 
22

Cách khuyến cáo là sử dụng constantize ActiveSupport của:

'User'.constantize 

Bạn cũng có thể sử dụng hạt nhân của const_get, nhưng trong Ruby < 2.0, nó không hỗ trợ hằng số không gian tên, vì vậy một cái gì đó như thế này:

Kernel.const_get('Foobar::User') 

sẽ không thành công trong Ruby < 2.0. Vì vậy, nếu bạn muốn có một giải pháp chung chung, bạn muốn được khôn ngoan để sử dụng cách tiếp cận ActiveSupport:

def my_constantize(class_name) 
    unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ class_name 
    raise NameError, "#{class_name.inspect} is not a valid constant name!" 
    end 

    Object.module_eval("::#{$1}", __FILE__, __LINE__) 
end 
+8

const_get cũng hoạt động cho các hằng số được đặt tên từ ruby ​​2.0 – untidyhair

+0

Vì Ruby 2.0 đã đạt đến EOL, không còn cần phải kéo ActiveSupport làm phụ thuộc để tham chiếu một hằng số bằng một chuỗi. :-) – Drenmi

+0

Xem thêm ''User'.safe_constantize' –

75
Object.const_get("User") 

Không cần phải yêu cầu ActiveSupport.

+40

+1 bệnh về các câu hỏi ruby ​​chung gây ô nhiễm. –

-3

Sử dụng ruby ​​magic method: eval():

eval("User") #=> User 
+4

Đây có lẽ là một quá mức cần thiết, vì 'eval' không có nghĩa là được sử dụng như thế này, và cần tránh hoàn toàn các lựa chọn thay thế cụ thể hơn. – yagooar

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