self in irb versus script

Discussion in 'Ruby' started by David Waller, Aug 12, 2010.

  1. David Waller

    David Waller Guest

    Howdy from a Ruby newbie--hope my question isn't too annoying.

    I'm working through a book on Ruby. Examples using self work fine in
    irb, but if I type the same examples in a script and run that I get this
    error message: private method called for...NoMethodError.

    So, my question is: what do I need to type to properly invoke self in a
    script (but that is not needed in the irb?).

    I should mention that the explanation of public vs. private methods
    isn't helping me. If I could just see what I have to actually type to
    use self in a script vs. the irb a light would go off in my head.

    Here's an example that runs in irb, but not in a script:


    def add(n)
    self + n
    end


    puts 2.add(2)


    The irb will display the result 4, but the script gives the "private
    method...NoMethodError" message.

    I'm puzzled as to why Ullman does not address this in his section on
    "Using Self."

    Thanks!

    -Doc Waller
    --
    Posted via http://www.ruby-forum.com/.
     
    David Waller, Aug 12, 2010
    #1
    1. Advertising

  2. David Waller

    Iain Barnett Guest

    On 12 Aug 2010, at 01:12, David Waller wrote:

    > Howdy from a Ruby newbie--hope my question isn't too annoying.
    >=20
    > I'm working through a book on Ruby. Examples using self work fine in
    > irb, but if I type the same examples in a script and run that I get =

    this
    > error message: private method called for...NoMethodError.
    >=20
    > So, my question is: what do I need to type to properly invoke self in =

    a
    > script (but that is not needed in the irb?).
    >=20
    > I should mention that the explanation of public vs. private methods
    > isn't helping me. If I could just see what I have to actually type to
    > use self in a script vs. the irb a light would go off in my head.
    >=20
    > Here's an example that runs in irb, but not in a script:
    >=20
    >=20
    > def add(n)
    > self + n
    > end
    >=20
    >=20
    > puts 2.add(2)
    >=20
    >=20
    > The irb will display the result 4, but the script gives the "private
    > method...NoMethodError" message.
    >=20
    > I'm puzzled as to why Ullman does not address this in his section on
    > "Using Self."
    >=20
    > Thanks!
    >=20
    > -Doc Waller
    > --=20
    > Posted via http://www.ruby-forum.com/.


    My irb gave me an error until I added the definition to a class (Integer =
    seemed right) :

    $ irb =20
    > 2.add(2)

    NoMethodError: undefined method `add' for 2:Fixnum
    from (irb):1
    from /Library/Frameworks/Ruby.framework/Programs/irb:12:in =
    `<main>'
    > def add(n)

    self + n
    end
    =3D> nil
    > 2.add(2)

    NoMethodError: private method `add' called for 2:Fixnum
    from (irb):5
    from /Library/Frameworks/Ruby.framework/Programs/irb:12:in =
    `<main>'
    > class Integer

    def add(n)
    self + n
    end
    end
    =3D> nil
    > 2.add(2)

    =3D> 4

    I'm not sure why your irb didn't give an error. Did you load any files =
    into it?


    Iain
     
    Iain Barnett, Aug 13, 2010
    #2
    1. Advertising

  3. David Waller

    David Waller Guest

    Iain Barnett wrote:


    > I'm not sure why your irb didn't give an error. Did you load any files
    > into it?
    >
    >
    > Iain


    Thanks, Iain. no, I didn't load any files (that I'm aware of)--and I
    double-checked just now by opening up the terminal fresh and going
    straight to irb and typing it in again--no error.

    However, I did find that putting the method into the Integer class as
    you did made the method work properly in a saved script! That moves my
    understanding of self forward a bit. Many thanks for your kind
    response!!

    -Dave
    --
    Posted via http://www.ruby-forum.com/.
     
    David Waller, Aug 13, 2010
    #3
  4. Hi --

    On Fri, 13 Aug 2010, David Waller wrote:

    > Iain Barnett wrote:
    >
    >
    >> I'm not sure why your irb didn't give an error. Did you load any files
    >> into it?
    >>
    >>
    >> Iain

    >
    > Thanks, Iain. no, I didn't load any files (that I'm aware of)--and I
    > double-checked just now by opening up the terminal fresh and going
    > straight to irb and typing it in again--no error.
    >
    > However, I did find that putting the method into the Integer class as
    > you did made the method work properly in a saved script! That moves my
    > understanding of self forward a bit. Many thanks for your kind
    > response!!


    The difference you're seeing is a difference in the way irb and the
    non-irb interpreter handle top-level methods. If you define a top-level
    method in a regular Ruby script, it becomes a private instance method of
    Object:

    $ ruby -e 'def x; end; p Object.private_instance_methods(false)'
    ["initialize", "x"]

    In irb, such methods become public instance methods of Object:

    irb(main):002:0> def x; end; p Object.public_instance_methods(false)
    ["x"]

    Private instance methods of Object are known to all objects, but because
    they're private, they can only be called without an explicit receiver.
    That means that you can't do:

    def x; end
    some_object.x # error: private method

    It's the same with methods like puts, raise, exit, and sleep. You can
    call:

    sleep(3)

    but not:

    some_object.sleep(3)

    (puts and company are actually private instance methods of Kernel, but
    it's the same kind of effect.)

    The point of all this is to allow Ruby to have these top-level methods,
    while still adhering underneath to the principle that every method call
    is a message being sent to some object.


    David

    --
    David A. Black, Senior Developer, Cyrus Innovation Inc.

    The Ruby training with Black/Brown/McAnally
    Compleat Philadelphia, PA, October 1-2, 2010
    Rubyist http://www.compleatrubyist.com
     
    David A. Black, Aug 13, 2010
    #4
    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. Ralf W. Grosse-Kunstleve
    Replies:
    16
    Views:
    603
    Lonnie Princehouse
    Jul 11, 2005
  2. Ralf W. Grosse-Kunstleve
    Replies:
    18
    Views:
    610
    Bengt Richter
    Jul 11, 2005
  3. Ralf W. Grosse-Kunstleve
    Replies:
    2
    Views:
    417
    Dan Sommers
    Jul 12, 2005
  4. falcon
    Replies:
    0
    Views:
    388
    falcon
    Jul 31, 2005
  5. Paul Butcher
    Replies:
    12
    Views:
    756
    Gary Wright
    Nov 28, 2007
Loading...

Share This Page