[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Confused about "private"??

John N. Alegre

2/27/2006 7:57:00 PM


I have a confusion in Ruby's way of dealing with "private" instance methods.

"Private" means that the method is accessible only within the class, and it
is callable only in "function form," with self (implicit or explicit) as a
receiver." "Protected" gives access to the method in subclasses.

as is the case in Java or Obj C

However ... here is some very simple code that is not doing what I
expect ...

####################################################
# Example One
# Works as expected
####################################################
/usr/bin/ruby -w

class MyClass
protected
def say
puts "Hello"
end
public
def sayit
self.say
end
end

class AClass < MyClass
end

puts "Start"
r = MyClass.new
r.sayit
t = AClass.new
t.sayit
#########################################
salamanca:~/Hack/Hack04/Ruby1 jna$ ./int.rb
Start
Hello
Hello

That is exactly as I expected with the subclass having access to a super
"protected" method.

####################################################
# Example Two
# Not as expected
####################################################
/usr/bin/ruby -w

class MyClass
private
def say
puts "Hello"
end
public
def sayit
self.say
end
end

class AClass < MyClass
end

puts "Start"
r = MyClass.new
r.sayit
t = AClass.new
t.sayit

#########################################
salamanca:~/Hack/Hack04/Ruby1 jna$ ./int.rb
Start
../int.rb:10:in `sayit': private method `say' called for #<MyClass:0x26148>
(NoMethodError)
from ./int.rb:19

What I expected to see here is the first call to r.sayit retruning "Hello"
as it is calling it's own "private" method. I expected to see the error on
the second call ot t.sayit.

What am I missing? This is not to the best of my knowledge the way things
are in Java.

Thanks
john

5 Answers

dblack

2/27/2006 8:05:00 PM

0

minkoo.seo@gmail.com

2/28/2006 6:49:00 AM

0

Here's the link to the thread that Dave mentioned:
http://tinyurl...

Hope you enjoy :-)

- Minkoo Seo

John N. Alegre

2/28/2006 11:16:00 PM

0

Minkoo,

Thanks ...

I found it yesterday and read it.

I guess I will NOT open old wounds;) but I am not comfortable with Ruby's
use of "private". I do not see what it accomplishes by not letting me call
a private method within an object by using the self reference. I was
raised on Smalltalk and have come to habitually use self when I refer to
the insides of an Object. With Ruby I have to now be conscious NOT to do
that.

Seams odd.

john

Minkoo Seo wrote:

> Here's the link to the thread that Dave mentioned:
> http://tinyurl...
>
> Hope you enjoy :-)
>
> - Minkoo Seo

Yukihiro Matsumoto

3/1/2006 3:16:00 AM

0

Hi,

In message "Re: Confused about "private"??"
on Wed, 1 Mar 2006 10:56:57 +0900, "John N. Alegre" <info@johnalegre.net> writes:

|I guess I will NOT open old wounds;) but I am not comfortable with Ruby's
|use of "private". I do not see what it accomplishes by not letting me call
|a private method within an object by using the self reference. I was
|raised on Smalltalk and have come to habitually use self when I refer to
|the insides of an Object. With Ruby I have to now be conscious NOT to do
|that.

Unlike Smalltalk, Ruby has methods to be called like functions in
other languages, for example, "print". They are set private to avoid
confusion.

matz.


John N. Alegre

3/1/2006 2:26:00 PM

0

Matz,

Thank you so much for taking the time to post this. It is great to get it
from the source.

I understand your point and the self.call thing is a small thing to get used
to considering the beauty of everything else.

Peace
john

Yukihiro Matsumoto wrote:

> Unlike Smalltalk, Ruby has methods to be called like functions in
> other languages, for example, "print".  They are set private to avoid
> confusion.
>
> matz.