為に:
class A; end
A.instance_eval do
puts "self=#{self}"
def m; puts "hi"; end
define_method(:n) {puts "ho" }
end
#=> "self=A"
次のことがわかります。
A.methods(false) #=> [:m]
A.instance_methods(false) #=> [:n]
A.m # hi
A.n # NoMethodError:...
A.new.m # NoMethodError:...
A.new.n # ho
A.instance_eval
はクラスを開きA
、メソッドm
は で定義されA
ます。次に、define_methodメソッドが呼び出され、:n
レシーバーにインスタンス メソッドが作成されますA
。
BasicObject#instance_evalではなくModule#class_evalを使用するとします。
A.class_eval do
puts "self=#{self}"
def m; puts "hi"; end
define_method(:n) {puts "ho" }
end
#=> "self=A"
次のことがわかります。
A.methods(false) #=> []
A.instance_methods(false) #=> [:m, :n]
A.m # NoMethodError:...
A.n # NoMethodError:...
A.new.m # hi
A.new.n # ho
したがって、この動作は次と同じであることがわかります。
class A
puts "self=#{self}"
def m; puts "hi"; end
define_method(:n) {puts "ho" }
end
def
ここで、インスタンス メソッドは または のいずれかで定義できますdefine_method
。