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)
Mic*_*ohl 32
像这样的东西?
>> Object.const_set("general_systems".classify, Class.new)
=> GeneralSystem
>> GeneralSystem.new
=> #<GeneralSystem:0x105b0f738>
Run Code Online (Sandbox Code Playgroud)
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)
请查看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)
鉴于:
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)