7

実行時のクラスの作成は次のように行われます。

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"
4

2 に答える 2

15

あなたが思っているよりも簡単です:)

Company.const_set "Employee", klass

に何かを設定するObjectと、すべてがであるため、グローバルになりますObjectconst_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"
于 2012-06-24T11:05:36.740 に答える
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]
于 2012-06-24T11:05:33.970 に答える