def initialize(name,age)
@name,@age = name,age
end
def <=>(other)
age <=> other.age
end
attr_reader :name,:age
protected :age
end
p1 = Person.new(“Fred”,21)
puts p1.age
That causes an error:
NoMethodError: protected method `age’ called for #<Person:0x2dc876c @age=31, @name=“fred”>
from (irb):41
However check this one out.
p2 = Person.new(“John”,23)
compage = (p1 <=> p2)
This one works.
My question is how come “other.age” works however “p1.age” doesn’t . I guess it has something to do with scope. Can someone put the explanation in an easy to understand
First off you are giving Ruby some confused signals.
attr_reader says to creat public accesor age. Then you declare age as
protected. Protected methods are not to be accessed outside the class.
Do not define age method protected.
def initialize(name,age)
@name,@age = name,age
end
def <=>(other)
age <=> other.age
end
attr_reader :name,:age
protected :age
end
p1 = Person.new("Fred",21)
puts p1.age
That causes an error:
NoMethodError: protected method `age' called for #<Person:0x2dc876c @age=31,
@name="fred">
from (irb):41
However check this one out.
p2 = Person.new("John",23)
compage = (p1 <=> p2)
This one works.
My question is how come "other.age" works however "p1.age" doesn't . I guess
it has something to do with scope. Can someone put the explanation in an
easy to understand sentence.
At the time you call a protected method on x, self must be an instance
of the same class (or a subclass) as x.
That is true inside <=>, where both self and other are of class
Person. But it's not true at the top level, where p1 is a Person but
self is the Object instance main (the top-level default object).
You should, as another poster suggested, have a look at the ruby-talk
list if you have Ruby-specific questions -- not because they're not
directly relevant to Rails development but because they'll fit in
better there and probably get more response overall.