カテゴリー別アーカイブ: メタプログラミング

Ruby リフレクション メソッド名の取得

class ParentClass
  def super_public_method
  end

  def super_private_method
  end
  private :super_private_method

  def super_protected_method
  end
  protected :super_protected_method
end

class ChildClass < ParentClass
  def public_method
  end

  def private_method
  end
  private :private_method

  def protected_method
  end
  protected :protected_method
end

child = ChildClass.new

def child.singleton_method
end
child.methods  # => [:singleton_method, :public_method, :protected_method, :super_public_method, :super_protected_method, ...]
child.public_methods  #=> [:singleton_method, :public_method, :super_public_method, ...]
child.private_methods  # => [:private_method, :super_private_method, ...]
child.protected_methods  # => [:protected_method, :super_protected_method]
child.singleton_methods  # => [:singleton_method]

Ruby リフレクション インスタンス変数の取得・設定

class Clazz
  def initialize
    @foo = 1
    @bar = 2
  end
end

clazz = Clazz.new

インスタンス変数の取得には, Object#instance_variable_get を利用します. 定義されていないインスタンス変数の場合には, nilが返ります.

clazz.instance_variable_get(:@foo)    # => 1
clazz.instance_variable_get(:@bar)    # => 2
clazz.instance_variable_get(:@bazz)  # => nil

インスタンス変数の設定には, Object#.instance_variable_set を利用します. 定義されていないインスタンス変数の場合には, 新たに定義されます.

clazz.instance_variable_set :@foo, 3
clazz.instance_variable_get(:@foo)  # => 3
clazz.instance_variable_set :@bazz, 4
clazz.instance_variable_get(:@bazz)  # => 4

Ruby リフレクション インスタンス変数名の取得

インスタンス変数名を配列で取得するには, Object#instance_variables を利用します.

class Clazz
  def initialize
    @foo = 1
    @bar = 2
  end
end

clazz = Clazz.new

clazz.instance_variables  # => [:@foo, :@bar]

また, インスタンス変数が定義されているかどうかを調べるには, Object#instance_variable_defined? を利用します.

clazz.instance_variable_defined?(:@foo)       # => true
clazz.instance_variable_defined?(:@bar)        # => true
clazz.instance_variable_defined?(:@barbaz)  # => false
clazz.instance_variable_defined?(:foo)           # => NameError