Confused about "private"??

Discussion in 'Ruby' started by John N. Alegre, Feb 27, 2006.

  1. 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
     
    John N. Alegre, Feb 27, 2006
    #1
    1. Advertising

  2. John N. Alegre

    Guest

    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 ()
    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
     
    , Feb 27, 2006
    #2
    1. Advertising

  3. John N. Alegre

    Minkoo Seo Guest

    Minkoo Seo, Feb 28, 2006
    #3
  4. 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.com/nhrn6
    >
    > Hope you enjoy :)
    >
    > - Minkoo Seo
     
    John N. Alegre, Feb 28, 2006
    #4
  5. Hi,

    In message "Re: Confused about "private"??"
    on Wed, 1 Mar 2006 10:56:57 +0900, "John N. Alegre" <> 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.
     
    Yukihiro Matsumoto, Mar 1, 2006
    #5
  6. 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.
     
    John N. Alegre, Mar 1, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. qazmlp
    Replies:
    19
    Views:
    829
    Daniel T.
    Feb 4, 2004
  2. DaveLessnau
    Replies:
    3
    Views:
    450
    Howard
    May 16, 2005
  3. Jeremy Bowers
    Replies:
    3
    Views:
    557
    Steven Bethard
    Jan 24, 2005
  4. Daniel Finnie
    Replies:
    3
    Views:
    210
    Logan Capaldo
    Dec 16, 2006
  5. Frank Meyer

    Private methods not so private?

    Frank Meyer, Aug 1, 2007, in forum: Ruby
    Replies:
    14
    Views:
    305
Loading...

Share This Page