Ruby字符串到类名

Tel*_*lmo 34 ruby metaprogramming

我正在尝试创建一个新类,它将继承自ActiveRecord::Base需要从字符串动态生成的类

"general_systems".camelize.singularize = Class.new < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

但是我一直收到错误:

undefined method `singularize=' for "GeneralSystems":String
Run Code Online (Sandbox Code Playgroud)

我也尝试constantize过字符串

>> foo = "general_systems".camelize.singularize
=> "GeneralSystem"
>> foo.constantize
NameError: uninitialized constant GeneralSystem
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/inflector/methods.rb:124:in `block in constantize'
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/inflector/methods.rb:123:in `each'
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/inflector/methods.rb:123:in `constantize'
    from /var/lib/gems/1.9.1/gems/activesupport-3.0.5/lib/active_support/core_ext/string/inflections.rb:43:in `constantize'
    from (irb):4
    from /usr/bin/irb:12:in `<main>'
>> foo.constantize = Class.new
NoMethodError: undefined method `constantize=' for "GeneralSystem":String
    from (irb):5
    from /usr/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Pet*_*ich 33

如果你正在使用Rails,它提供了一个#constantize可以工作的方法:

irb(main):017:0> Object.const_get 'House::Owns'
NameError: wrong constant name House::Owns

'House::Owns'.constantize
=> House::Owns
Run Code Online (Sandbox Code Playgroud)

  • #constantize是一个Rails方法.http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize (6认同)
  • 我得到:`1.9.3p392:019>'House :: Owns'.constantize NoMethodError:未定义方法`constantize'代表"House :: Owns":来自(irb)的字符串:来自/Users/ryan/.rvm/rubies的19 /ruby-1.9.3-p392/bin/irb:16:in <main>'` (2认同)

Mic*_*ohl 32

像这样的东西?

>> Object.const_set("general_systems".classify, Class.new)
=> GeneralSystem
>> GeneralSystem.new
=> #<GeneralSystem:0x105b0f738>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个积极支持的习语 (3认同)

yfe*_*lum 13

klazz = Class.new(ActiveRecord::Base) do
  def do_something_fun(param1)
    param1.have_fun!
  end
end

klazz_name = "general_systems".singularize.classify
Object.const_set(klazz_name, klazz)
Run Code Online (Sandbox Code Playgroud)


ASh*_*lly 8

请查看Ruby Book安装程序中包含的"The Book of Ruby"中的这个示例.

puts("What shall we call this class?> ")
className = gets.strip().capitalize()
Object.const_set(className,Class.new)
puts("I'll give it a method called > 'myname'" ) 
className = Object.const_get(className)
className::module_eval{
  define_method(:myname){ 
    puts("The name of my class is '#{self.class}'" ) 
 } }
 x = className.new x.myname
Run Code Online (Sandbox Code Playgroud)


Con*_*nor 5

鉴于:

class Banana
end
Run Code Online (Sandbox Code Playgroud)

您可以使用普通 Ruby 获取该类:

Object.const_get 'Banana'
=> Banana
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是 Rails:

'Banana'.constantize
=> Banana
Run Code Online (Sandbox Code Playgroud)


rm-*_*-rf 1

尝试

>> "general_systems".classify
=> "GeneralSystem"
Run Code Online (Sandbox Code Playgroud)