# 例子二classAenda=A.newa.instance_evaldoputsself# => a# current class => a's singleton classdefmethod1puts"this is a singleton method of instance a"endenda.method1#=> this is a singleton method of instance ab=A.newb.method1#=> NoMethodError: undefined method `method1' for #<A:0x007fbc2ced9550>from(pry):13:in`<main>'
# 例子三classAendA.instance_evaldoputsself# => A# current class => A's singleton classdefmethod1puts'this is a singleton method of class A'endendA.method1# this is a singleton method of class A#=> nil#=> NoMethodError: undefined method `method1' for #<A:0x007fbc3009e180>from(pry):11:in`<main>'
# 例子五classAenda=A.newa.method1#=> NoMethodError: undefined method `method1' for <A:0x007fbc29a826f8> from (pry):21:in `<main>'A.class_evaldodefmethod1puts'this is a instance method of class A'endenda.method1#=> this is a instance method of class A
# 例子六moduleFoodeffooputs'foo method with include...'endendclassBarincludeFooendBar.new.foo# foo method with include...# => nilBar.foo# NoMethodError: undefined method `foo' for Bar:Class# from (pry):75:in `<main>'classBazextendFooendBaz.foo# foo method with include...# => nilBaz.new.foo# NoMethodError: undefined method `foo' for #<Baz:0x007f8061dec068># from (pry):80:in `<main>'
moduleConcernclassMultipleIncludedBlocks<StandardError#:nodoc:definitializesuper"Cannot define multiple 'included' blocks for a Concern"endenddefself.extended(base)#:nodoc:base.instance_variable_set(:@_dependencies,[])enddefappend_features(base)ifbase.instance_variable_defined?(:@_dependencies)base.instance_variable_get(:@_dependencies)<<selfreturnfalseelsereturnfalseifbase<self@_dependencies.each{|dep|base.include(dep)}superbase.extendconst_get(:ClassMethods)ifconst_defined?(:ClassMethods)base.class_eval(&@_included_block)ifinstance_variable_defined?(:@_included_block)endenddefincluded(base=nil,&block)ifbase.nil?raiseMultipleIncludedBlocksifinstance_variable_defined?(:@_included_block)@_included_block=blockelsesuperendenddefclass_methods(&class_methods_module_definition)mod=const_defined?(:ClassMethods,false)?const_get(:ClassMethods):const_set(:ClassMethods,Module.new)mod.module_eval(&class_methods_module_definition)endend
classTodo# Other todo implementation# ...## Event trackinghas_many:eventsbefore_create:track_creationafter_destroy:track_deletionprivatedeftrack_creation# ...endend
通过ActiveSupport::Concern
1234567891011121314151617181920
classTodo# Other todo implementation# ...moduleEventTrackingextendActiveSupport::Concernincludeddohas_many:eventsbefore_create:track_creationafter_destroy:track_deletionendprivatedeftrack_creation# ...endendincludeEventTrackingend
通过concerning
1234567891011121314151617181920
classTodo<ActiveRecord::Base# Other todo implementation# ...concerning:EventTrackingdoincludeddohas_many:eventsbefore_create:track_creationafter_destroy:track_deletionendprivatedeftrack_creation# ...endendendTodo.ancestors# [Todo,Todo::EventTracking,...]