為に:
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。