dan*_*lee 7 ruby namespaces module runtime class
在运行时创建类如下:
klass = Class.new superclass, &block
Object.const_set class_name, klass
Run Code Online (Sandbox Code Playgroud)
例:
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"
Run Code Online (Sandbox Code Playgroud)
现在,假设您有一个名为Company的模块:
module Company
end
Run Code Online (Sandbox Code Playgroud)
如何在公司模块/命名空间内的运行时创建Employee类,以便以下产生相同的结果?
puts Company::Employee.new.name # prints "Jon Doe"
Run Code Online (Sandbox Code Playgroud)
Ser*_*sev 15
比你想象的更容易:)
Company.const_set "Employee", klass
Run Code Online (Sandbox Code Playgroud)
当你设置的东西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"
Run Code Online (Sandbox Code Playgroud)