From: Stefano Crocco Date: 2008-03-21T23:36:21+09:00 Subject: Re: Newbie question : private / public methods On Friday 21 March 2008, krzysieq Gazeta.pl wrote: > Hi, > > I'm new both to this mailing list and to Ruby. Here's an example, question > will come later. > > >> private.rb > > class PrivateMethodTest > private > def privateMethod(the_string) > 'haha! ' + the_string > end > > public > def publicMethod(the_string) > self.privateMethod(the_string) > end > end > > >> private_test.rb > > require 'private.rb' > require 'test/unit' > > class PrivateMethodTestTest < Test::Unit::TestCase > > def test_publicMethod > var = PrivateMethodTest.new() > assert_equal('haha! test', var.publicMethod('test')) > end > end > > Now the question: why is it, that when the self. (bolded in the code) is > there, the test fails, whereas if I remove it, the test is successful? This > is the failure message: > > 1) Error: > test_publicMethod(PrivateMethodTestTest): > NoMethodError: private method `privateMethod' called for > # > ./private.rb:9:in `publicMethod' > private_test.rb:8:in `test_publicMethod' > > What am I missing? > > Thanks for any help and sorry if this question is silly :) > Cheers, > Chris Ruby implements private methods as methods which can't be called using an explicit receiver (i.e, using the form obj.method_name), but only using the implicit receiver (that is, method_name). Since the implicit receiver is always self, this ensures that private instance methods can only be called by instance methods of that class (or of derived classes) and can't be accessed by other instances of the same class. An unpleasant side effect of this is that you can't call private methods using the explicit receiver even when that receiver is equal to the implicit one (that is, self), which is the situation you discovered.