ここではメタプログラミングをする上で使うメソッドについてまとめていきたいと思います。まだメタプログラミングがなんぞかは分かってない←
instance method Module#define_method
メソッド定義のために使うメソッド。第一引数に指定した名前のメソッド名とし、第二引数にそのメソッドの処理内容を指定する。ブロックを渡した場合は、ブロック内の処理内容がメソッドの処理内容となる。
[:failure, :error, :success].each do |method|
define_method method do
self.state = method
end
end
https://docs.ruby-lang.org/ja/latest/method/Module/i/define_method.html
instance method BasicObject#instance_exec
与えられたブロックをレシーバのコンテキストで実行する。第一引数で変数を受け取ることができ、またレシーバのコンテキストとなるので、インスタンス変数やメソッドにアクセスすることができる。
class Fuga
def initialize
@fuga = 10
end
def number
3
end
end
fuga = Fuga.new
fuga.instance_exec(5) { |x| x + @fuga + self.number } # => 18
https://docs.ruby-lang.org/ja/latest/method/BasicObject/i/instance_exec.html
instance method Object#instance_variable_set
第一引数に指定したインスタンス変数のシンボルに第二引数の値をセットする。
class Fuga; end
fuga = Fuga.new
fuga.instance_variable_set(:@foo, 'foo')
puts fuga.instance_variable_get(:@foo) # => 'foo