Rubystring类名称
我想创build一个新的类,将从ActiveRecord :: Baseinheritance类需要dynamic生成一个string
"general_systems".camelize.singularize = Class.new < ActiveRecord::Base
但是我不断收到错误:
undefined method `singularize=' for "GeneralSystems":String
我也试着“串化”string
>> 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>'
任何帮助将不胜感激。
像这样的东西?
>> Object.const_set("general_systems".classify, Class.new) => GeneralSystem >> GeneralSystem.new => #<GeneralSystem:0x105b0f738>
如果你使用的是Rails,它提供了一个叫做#constantize
的方法,
irb(main):017:0> Object.const_get 'House::Owns' NameError: wrong constant name House::Owns 'House::Owns'.constantize => House::Owns
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)
从Ruby 1.9安装程序中的“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
如果你的string包含一个名字空间,你可以使用:
require 'rubygems' require 'active_support/inflector' parent=String # using String to get a self contained example # require 'active_record' # uncomment for ActiveRecord::Base as parent class # parent=ActiveRecord::Base # uncomment for ActiveRecord::Base as parent class namespace = 'A::B::general_systems'.split('::') class_name = namespace.pop namespace = namespace.inject(Object) do |mod, name| if mod.constants.collect{|sym| sym.to_s}.include? name.classify mod.const_get name.classify else mod.const_set name.classify, Module.new end end klass = if namespace.constants.include? class_name.classify namespace.const_get class_name.classify else namespace.const_set class_name.classify, Class.new(parent) end object = klass.allocate # allocate new object of klass object.send :initialize # initialize object object.class object.class.superclass
尝试
>> "general_systems".classify => "GeneralSystem"