rubyサブクラスを動的に定義し、定義するかどうかを判断します.

1469 ワード

前編では、動的クラス変数を定義する標準があります.

class MyClass
  class << self
    attr_accessor :my_constant
  end
  def my_method
    self.class.my_constant = "blah"
  end
end

p MyClass.my_constant #=> nil
MyClass.new.my_method

p MyClass.my_constant #=> "blah"

クラスも動的に定義されている場合、サブクラスとmoduleはどのように定義されますか?

dynamic_name = "TestEval2"

Object.const_set(dynamic_name, Class.new{def method1() 42 end }})
dummy2 = eval("#{dynamic_name}")
puts "dummy2: #{dummy2}"

dynamic_name = "SubTestEval2"

SubModule.const_set(dynamic_name, Class.new(TestEval2){def method1() 43 end })
dummy3 = eval("#{dynamic_name}")
puts "dummy3: #{dummy3}"

動的クラスが存在するかどうかを判断する

def class_exists?(class_name)
  eval("defined?(#{class_name}) && #{class_name}.is_a?(Class)") == true
end

class_name = "Blorp"
class_exists?(class_name)
=> false

class_name = "String"
class_exists?(class_name)
=> true


define_method定義のメソッドパラメータはどこに置きますか?

define_method(:say_hi) { |other| puts "Hi, " + other }