Dla różnicy pomiędzy class_eval
i instance_eval
patrz Dynamically creating class method
class A; end
A.class_eval do
attr_accessor :x
def barx; end
define_method :foox do; end
end
print 'A.instance_methods : '; p A.instance_methods(false).sort
print 'A.singleton_methods : '; p A.singleton_methods
class B; end
B.instance_eval do
attr_accessor :y
def bary; end
define_method :fooy do; end
end
print 'B.instance_methods : '; p B.instance_methods(false).sort
print 'B.singleton_methods : '; p B.singleton_methods
class C; end
singleton_class = class << C; self end
singleton_class.instance_eval do
attr_accessor :z
def barz; puts 'where is barz ?' end
define_method :fooz do; end
end
print 'C.instance_methods : '; p C.instance_methods(false).sort
print 'C.singleton_methods : '; p C.singleton_methods
print 'singleton_class.barz : '; singleton_class.barz
print 'singleton_class.methods : '; p singleton_class.methods(false)
Output (ruby 1.8.6):
A.instance_methods : ["barx", "foox", "x", "x="]
A.singleton_methods : []
B.instance_methods : ["fooy", "y", "y="]
B.singleton_methods : ["bary"]
C.instance_methods : []
C.singleton_methods : ["z", "z=", "fooz"]
singleton_class.barz : where is barz ?
singleton_class.methods : ["barz"]
Jak widać z B, mimo że zazwyczaj tworzy instance_eval metody singleton, oczywiście attr_accessor
i define_method
wymuszają definicję metod instancji.
człowiek, który jest zawalony. Świetne przykłady. @ Odpowiedź Daniel_Vartanov właściwie tłumaczy, dlaczego 'attr_accessor' nie odnosi się do siebie, ale jest to świetny sposób zilustrowania, co dokładnie dzieje się z każdym typem metody def'n. Wielkie dzięki. – brad