From: "David A. Black" Date: 2005-05-16T09:18:50+09:00 Subject: Re: Visibility and the "self" receiver Hi -- On Mon, 16 May 2005, M. Maniak wrote: > Hello, > > I'm new to Ruby (coming from Java) and puzzled > by the behaviour of "self" when defining a private method: > > -->Snip > class TestClass > > def initialize(args) > @myString = args > self.print() > end > > private > def print() > puts @myString > end > end > -->Snip > > This produces a NameError when instantiated/executed. > Without reference to itself (without "self") everything works... > > I guess print() is then treated as a function and not as > a method (whatever that means in OOP -> maybe no return value). In Ruby everything you define with "def" is a method, and has a return value. > I know that in Java "this" is a somehow comparable reference > with "self" in Ruby and denotes the actual object. I use it > quite often... > > Has anyone an explanation about this specific behaviour (I know > it's not a bug)? Maybe I don't get the principle of "private" > or Visibility in general in Ruby. "private" basically means: this method can only be called *without* an explicit receiver. "self" is considered an explicit receiver, even though it's the current object. There are some cases where you must use "self", and you're allowed to do that even for a private method. (Specifically, you always need an explicit receiver for methods that end with "=", because otherwise they'll be parsed as assignment to a local variable.) But other than those cases, if you have to specify a receiver, you are not in a scope where you can call that receiver's private methods. David -- David A. Black dblack@wobblini.net