类的Ruby符号
在Ruby中有没有一种方法可以将一个符号或字符串转换成一个同名的类 例如,如果我有一个类,如类的Ruby符号,ruby,class,transform,symbols,Ruby,Class,Transform,Symbols,在Ruby中有没有一种方法可以将一个符号或字符串转换成一个同名的类 例如,如果我有一个类,如 class Bob def talk puts "Hi, I'm bob" end end 代码中其他地方的一个方法被传递了一个符号:bob,我能以某种方式将其转换为类bob吗?也许像 b = :Bob.new b.talk 或者有类似的方法吗?名称空间。const_get(classname)将返回类对象(假设classname包含类的名称-如果它包含非类的常量的名称,它将返回该
class Bob
def talk
puts "Hi, I'm bob"
end
end
代码中其他地方的一个方法被传递了一个符号:bob,我能以某种方式将其转换为类bob吗?也许像
b = :Bob.new
b.talk
或者有类似的方法吗?名称空间。const_get(classname)
将返回类对象(假设classname包含类的名称-如果它包含非类的常量的名称,它将返回该常量的值)。顶级名称空间是Object,因此可以执行Object.const\u get(:Bob).new
Rails
class Bob
end
def create(name)
return eval("#{name}.new")
end
b = create(:Bob)
puts b.class
仅用于导轨
使用字符串:
"Module".constantize #=> Module
"Class".constantize #=> Class
带符号:
:module.to_s.classify.constantize #=> Module
:open_struct.to_s.classify.constantize #=> OpenStruct
如果要处理多单词符号,则需要将#classify
添加到链中,以正确处理常量所有部分的大小写
有很多方法可以做到这一点。你缺乏背景,无法选择“最佳”方式。这里有几条小路
Kernel.const_get(:Bob)
eval(:Bob.to_s)
Kernel.const_get(:bob.to_s.capitalize)
如果您想将:foo_bar转换为FooBar,我看到的所有解决方案都不起作用。如果这就是你想要的: :foo_bar.to_.split(“”).collect(&:capitalize)。join.constantize
=>FooBar
希望这对其他人有所帮助。以下是我在寻找包含模块/命名空间支持的类似功能时想到的:
['foo', 'bar'].inject {|r,e| "#{r.classify}::#{e.classify}"}.constantize
产生
=> Foo::Bar
然而,这需要Rails,当然它只在数组有多个元素的情况下工作
这似乎相当简单,所以我肯定我遗漏了一些东西,有人愿意建议为什么这不是一个好方法吗
谢谢 在我的例子中,下面两个例子都有效,但您也不要忘记名称空间:
Object.const_get("ModuleName::#{class_model_name}")
或
抱歉,我应该补充一点,这是Rails独有的功能。如果您使用Rails,这可能是最好的解决方案。这个问题专门询问符号,并且Rails中的Symbol类中不存在constantize。答案应该是:
:Module.to_.constantize
。好吧,谢天谢地,我没有要求最好的方法,只是一种方法……)对于这种情况,如果Bob
是在模块People
中定义的,并且您知道它,那么您可以People.const\u get(:Bob)
这就是camelize的用法::foo\u bar.to\s。camelize@DaveSimscamelize
是一个ActiveRecord扩展:,虽然constantize
也是。是的,像Dan Frade一样,我应该提到这一点。:)你是在问答案里面的问题吗?为了羞愧!;)@JustinStolle,我不认为这是一个新问题,更多关于原始问题的指导?:)
Kernel.const_get("ModuleName::#{class_model_name}").