在模块/命名空间内的运行时创建一个类

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)