2015年1月23日 星期五

[Ruby] class_eval and instance_eval

一些實驗. in Ruby1.9.3
class A; end A.class_eval do attr_accessor :x def barx; end define_method :foox do; end end p A.instance_methods(false).sort 結果: [:barx, :defined_in_class_eval, :foox, :x, :x=] p A.singleton_methods 結果 : [:defined_in_instance_eval, :yaml_tag, :const_missing] class B; end B.instance_eval do attr_accessor :y def bary; end define_method :fooy do; end end p B.instance_methods(false).sort 結果: [:fooy, :y, :y=] p B.singleton_methods 結果: [:bary, :yaml_tag, :const_missing] 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 p C.instance_methods(false).sort 結果: [] p C.singleton_methods 結果: [:z, :z=, :fooz, :yaml_tag, :const_missing] singleton_class.barz 結果: where is barz ? p singleton_class.methods(false) 結果: [:barz] 所有結果對照: 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"]

【下列文章您可能也有興趣】

沒有留言: