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).
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.
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.
I'm new to Ruby (coming from Java) and puzzled
by the behaviour of "self" when defining a private method:
try:
-->Snip
class TestClass
def initialize(args) @myString = args
print()
end
private
def print()
puts @myString
end
end
-->Snip
... which should work.
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).
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 methods can only be called without an explicit receiver. This
means that they can only be called when the implicit receiver is
"self", and no receiver is specified:
class A
private
def a() :a end
end
A.new.a #==> error, a is private and called with an explicit receiver.
A.new.instance_eval do #==> changes self to A.new for this block
self.a #==> error, explicit receiver
a #==> no error, implicit receiver is self
end
HTH,
Mark
···
On 5/15/05, M. Maniak <skull2crush@hotmail.com> wrote: