Forum: Ruby Confused about "private"??

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B2561fdd05855be51aca982c54eb9f81?d=identicon&s=25 John N. Alegre (Guest)
on 2006-02-27 20:59
(Received via mailing list)
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
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 unknown (Guest)
on 2006-02-27 21:06
(Received via mailing list)
Hi --

On Tue, 28 Feb 2006, John N. Alegre wrote:

>
> 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.

Private methods cannot be called with an explicit receiver, and "self"
is an explicit receiver.  The only exception is "setter" methods
(ending with an equal sign), where you need an explicit receiver so
that it isn't taken for assignment to a variable.

There was a long thread about this in the past week or so -- have a
look.

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

Why would it be? :-)


David

--
David A. Black (dblack@wobblini.net)
Ruby Power and Light (http://www.rubypowerandlight.com)

"Ruby for Rails" chapters now available
from Manning Early Access Program! http://www.manning.com/books/black
47b36de21d7ecbc824c81d24802a6290?d=identicon&s=25 Minkoo Seo (pool007)
on 2006-02-28 07:53
(Received via mailing list)
Here's the link to the thread that Dave mentioned:
http://tinyurl.com/nhrn6

Hope you enjoy :-)

- Minkoo Seo
B2561fdd05855be51aca982c54eb9f81?d=identicon&s=25 John N. Alegre (Guest)
on 2006-03-01 03:00
(Received via mailing list)
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
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2006-03-01 04:16
(Received via mailing list)
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.
B2561fdd05855be51aca982c54eb9f81?d=identicon&s=25 John N. Alegre (Guest)
on 2006-03-01 15:28
(Received via mailing list)
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
This topic is locked and can not be replied to.