2012-06-24 112 views
4

在运行时创建类作为进行中在运行时创建一个类如下:模块/命名空间

klass = Class.new superclass, &block 
Object.const_set class_name, klass 

例子:

class Person 
    def name 
    "Jon" 
    end 
end 

klass = Class.new Person do 
    def name 
    "#{super} Doe" 
    end 
end 

Object.const_set "Employee", klass 

puts Employee.new.name # prints "Jon Doe" 

现在,让我们说,你有一个模块公司名称:

module Company 
end 

如何创建Employee类公司模块/名称空间内的运行时处的s ,以便产生相同的结果?

puts Company::Employee.new.name # prints "Jon Doe" 

回答

12

比你想象:)

Company.const_set "Employee", klass 

当你Object设置一些轻松,它成为全球性,因为,一切是Object。但是你可以为每个课程/模块做const_set。请记住,模块/类只是常数。所以,Company::Employee是一个常数Employee在常数Company。这很简单:)

全码:

class Person 
    def name 
    "Jon" 
    end 
end 

klass = Class.new Person do 
    def name 
    "#{super} Doe" 
    end 
end 

module Company 
end 

Company.const_set "Employee", klass 

Company::Employee.new.name # => "Jon Doe" 
+0

打你2秒字面上:P –

+0

@MichaelKohl:是的,我花了他们在切割/粘贴该行:) –

+0

感谢您的回答和解释,塞尔吉奥! – danlee

2

您已经有了所有必要的片段:

class Person 
    def name 
    "Jon" 
    end 
end 

klass = Class.new Person do 
    def name 
    "#{super} Doe" 
    end 
end 

module Company 
end 

Company.const_set "Employee", klass 

puts Company::Employee.new.name # prints "Jon Doe" 

Company.constants.grep(/Emp/) 
#=> [:Employee]