类的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包含类的名称-如果它包含非类的常量的名称,它将返回该

在Ruby中有没有一种方法可以将一个符号或字符串转换成一个同名的类

例如,如果我有一个类,如

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@DaveSims
camelize
是一个ActiveRecord扩展:,虽然
constantize
也是。是的,像Dan Frade一样,我应该提到这一点。:)你是在问答案里面的问题吗?为了羞愧!;)@JustinStolle,我不认为这是一个新问题,更多关于原始问题的指导?:)
  Kernel.const_get("ModuleName::#{class_model_name}").