Joshua Ballanco
6/4/2009 7:35:00 AM
In Ruby, private means that the method cannot be called with an
*explicit* receiver (that includes "self"). This is a bit different
then languages like C++ and Java which use private/protected to
control calling in inheritance chains. Remember, Ruby is all about the
callers and receivers. If you leave off the "self." at the front, then
self is *implicit* (which is allowed for private methods. Try this:
class MyClass
def call_protected_on(obj)
obj.protected_method
end
def call_private_on(obj)
obj.private_method
end
protected
def protected_method
puts "Explicit callers are ok"
end
private
def private_method
puts "Implicit callers only!"
end
end
my_obj = MyClass.new
my_other_obj = MyClass.new
my_obj.call_protected_on(my_other_obj)
my_obj.call_private_on(my_other_obj)
Cheers,
Josh
On Jun 3, 2009, at 11:55 PM, timr wrote:
> Why is it that when you call a private method, you cannot use
> self.the_priv_method?
> Below is an example that works if you take out self before the method,
> but fails with it in.
> It is odd because using self should just a more explicit statement.
> But either way the method is being sent to the same object.
> WEIRD!!!!
> Please let me know how you gurus wrap your heads around this
> (apparent) inconsistency.
> Thanks,
> Tim
>
>
> class TestPrivate
> def giveValue
> @value
> end
> def callPriv
> self.priv #why can't you put the self in front of a private method?
> end
>
> private
> def priv
> @value = 100
> end
> end
>
>
> i = TestPrivate.new
> p i
> i.callPriv
> p i.giveValue
> # ~> -:6:in `callPriv': private method `priv' called for
> #<TestPrivate:
> 0x33e1f4> (NoMethodError)
> # ~> from -:18
> # >> #<TestPrivate:0x33e1f4>
>