int*_*rgc 34 ruby symbols class transform
Ruby中是否有一种方法可以使用符号或字符串并将其转换为同名的类?
例如,如果我有一个类如
class Bob
def talk
puts "Hi, I'm bob"
end
end
Run Code Online (Sandbox Code Playgroud)
我在代码中的其他地方的方法传递了一个符号:bob,我能以某种方式将其转换为类Bob吗?也许是这样的
b = :Bob.new
b.talk
Run Code Online (Sandbox Code Playgroud)
或者有办法做类似的事情吗?
Aug*_*aas 53
有很多方法可以做到这一点.缺乏背景使得无法选择"最佳"方式.这里有几个.
Kernel.const_get(:Bob)
eval(:Bob.to_s)
Kernel.const_get(:bob.to_s.capitalize)
Run Code Online (Sandbox Code Playgroud)
Dan*_*ade 40
仅适用于Rails.
用字符串:
"Module".constantize #=> Module
"Class".constantize #=> Class
Run Code Online (Sandbox Code Playgroud)
带符号:
:module.to_s.classify.constantize #=> Module
:open_struct.to_s.classify.constantize #=> OpenStruct
Run Code Online (Sandbox Code Playgroud)
如果您正在处理多字符号,那么您将需要添加#classify到链中以正确处理常量的所有部分的大小写.
http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize
小智 10
如果你想转向,我见过的解决方案都没有工作:foo_bar到FooBar.如果那就是你要找的东西:
:foo_bar.to_s.split("_").collect(&:capitalize).join.constantize
=> FooBar
希望有人帮助.
NameSpace.const_get(classname)将返回类对象(假设classname包含类的名称 - 如果它包含不是类的常量的名称,它将返回该常量的值).toplevel命名空间是Object,所以你可以这样做Object.const_get(:Bob).new