Ruby符号到类

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)

  • 只是对于这种情况,如果`Bob`在模块`People`中定义并且你知道它,你可以`People.const_get(:Bob)` (9认同)
  • 好吧,谢天谢地,我没有要求"最好"的方式,但只是一种方式......;) (4认同)

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

  • 对不起,我应该补充一点,这只是Rails的事情. (8认同)

小智 10

如果你想转向,我见过的解决方案都没有工作:foo_bar到FooBar.如果那就是你要找的东西:

:foo_bar.to_s.split("_").collect(&:capitalize).join.constantize
=> FooBar

希望有人帮助.

  • @DaveSims`camelize`是一个ActiveRecord扩展:http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-camelize,尽管是`constantize`. (4认同)

sep*_*p2k 5

NameSpace.const_get(classname)将返回类对象(假设classname包含类的名称 - 如果它包含不是类的常量的名称,它将返回该常量的值).toplevel命名空间是Object,所以你可以这样做Object.const_get(:Bob).new