ruby - 在运行时在模块/命名空间中创建一个类

标签 ruby class module namespaces runtime

创建类在运行时按如下方式完成:

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"

现在,假设您有一个名为 Company 的模块:

module Company
end

如何在 Company 模块/命名空间内运行时创建 Employee 类,以便以下产生相同的结果?

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

最佳答案

比你想象的要简单:)

Company.const_set "Employee", klass

当您在 Object 上设置某些内容时,它就变成了全局的,因为一切都是 Object。但是您可以对每个类/模块执行 const_set。请记住,模块/类只是常量。所以,Company::Employee 是常量 Company 中的常量 Employee。很简单:)

完整代码:

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"

关于ruby - 在运行时在模块/命名空间中创建一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11176895/

相关文章:

perl - 如何强制卸载 Perl 模块?

rust - 导入 Rust

ruby-on-rails - 从 mixin 访问类名

ruby - Rspec/Sinatra 模块化与经典风格

ruby-on-rails - 如何加快 rails 交通发展?

ruby-on-rails - 基于模型向路由中的正则表达式添加元素

python - 无法导入守护程序类

c++ - C++中的多个降序对象

java - 查找成对的最小值和最大值java

drupal 模块页面