From: Trans Date: 2008-08-30T03:17:26+09:00 Subject: Re: mysterious behavior of mixins On Aug 29, 1:26 pm, i3dmaster wrote: > I am trying to learn how mixins are behaved and encountered a strange > behavior and got me even confused... > > irb(main):151:0> module A > irb(main):152:1>   def self.showself > irb(main):153:2>     puts "self is #{self.inspect}" > irb(main):154:2>   end > irb(main):155:1>   def showself > irb(main):156:2>     puts "self is #{self.inspect}" > irb(main):157:2>   end > irb(main):158:1> end > => nil > irb(main):159:0> A.showself > self is A > => nil > irb(main):160:0> class B > irb(main):161:1>   include A > irb(main):162:1> end > => B > irb(main):163:0> B.showself > self is B Are you sure about this? Ruby doesn't do that. (Which I've never been completely happy about, but that's another story...) > => nil > irb(main):164:0> B.new.showself > self is # > => nil > irb(main):165:0> class C > irb(main):166:1>   def self.showself > irb(main):167:2>     puts "in C's showself" > irb(main):168:2>   end > irb(main):169:1> > irb(main):170:1* end > => nil > irb(main):171:0> class B < C > irb(main):172:1>   include A > irb(main):173:1> end > TypeError: superclass mismatch for class B >         from (irb):171 >         from :0 > > Then I tried another several times and it always throws out TypeError, > then I tried this: > > irb(main):022:0> class D > irb(main):023:1>   include A > irb(main):024:1> end > => D > irb(main):025:0> D.showself > NoMethodError: undefined method `showself' for D:Class >         from (irb):25 >         from :0 > irb(main):026:0> ^C > irb(main):026:0> quit > > I was able to minxin A's class method (using class B) just a moment > ago. What the heck is going on? Questions: > Does mixins allow mixin class methods or not? If not, what's the > common idiom to mixin class methods? > Is there a concept of protected or private mixins? I see mixins be > able to just mixed in with arbitrary classes. Is there possible to > force some certian mixins only be able to be mixed in with a certain > classes or other modules? Look into Module#included and Module#append_features. Eg. module X def self.included(base) base.extend MetaX end module MetaX # class method here end extend MetaX end T.