I just want to make a note of something I read here:
http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Protected
def <=>(other) self.age <=> other.age end
It says:
"If age is private, this method will not work, because other.age is not accessible. If "age" is protected, this will work fine, because self and other are of same class, and can access each other's protected methods."
That statement is not actually true. They won't access each other's protected methods. They will access their own protected methods of the same class.
Demonstration:
1.9.3p0 :001 > class A 1.9.3p0 :002?> protected 1.9.3p0 :003?> def method 1.9.3p0 :004?> puts "self is #{self.object_id}" 1.9.3p0 :005?> end 1.9.3p0 :006?> end
1.9.3p0 :009 > class A 1.9.3p0 :010?> def calling_method(o) 1.9.3p0 :011?> self.method 1.9.3p0 :012?> o.method 1.9.3p0 :013?> end 1.9.3p0 :014?> end => nil 1.9.3p0 :015 > b = A.new => #<A:0x007fcfe5b20900> 1.9.3p0 :016 > a.calling_method(b) self is 70265443297880 self is 70265444304000
As you can see, b is not invoking a's protected method. It's invoking its own, that was stored separately in this object, just as the instance vars are stored separately per object. I'm sure that's what the book intended, but when it comes to writing, you have to be careful to clarify for accuracy.