as you can see, irb makes methods public and ruby private
what rationale is behind this behaviour?
is this something that will be “fixed” in future
or is deliberately dicision/feature
as you can see, irb makes methods public and ruby private
what rationale is behind this behaviour?
is this something that will be “fixed” in future
or is deliberately dicision/feature
Regards, Daniel
What’s going on is that when you use irb, you are inside a class called
“main”; so when you “def square …” you have really created an instance
method main#square. In pure ruby, your “def square …” creates a
top-level method.
I do not off the cuff understand why that changes things the way you’re
seeing, but I think it means that, particularly when using ruby (vs
irb), you should only “def” inside an explicit class.
puts Object.private_methods.grep /square/ # yes it’s there
What’s going on is that when you use irb, you are inside a class called
“main”; so when you “def square …” you have really created an instance
method main#square. In pure ruby, your “def square …” creates a
top-level method.
main isn’t a class:
irb(main):021:0> self
=> main
irb(main):022:0> self.class
=> Object
It’s a default object, a sort of backstop. Also, it’s not
irb-specific:
$ ruby -e ‘p self; p self.class’
main
Object
I do not off the cuff understand why that changes things the way
you’re seeing, but I think it means that, particularly when using
ruby (vs irb), you should only “def” inside an explicit class.
I wouldn’t say that. There’s nothing wrong with creating top-level
methods in Ruby scripts or in irb, if that’s the scope you need them
in.
I’m not sure why irb doesn’t make top-level methods private, but I
think that’s the only difference (in this area) between irb and Ruby.
D> I’m not sure why irb doesn’t make top-level methods private, but I
D> think that’s the only difference (in this area) between irb and Ruby.
You can change its context
moulon% irb --context-mode 0
irb(main):001:0> def aa() 1+1; end
=> nil
irb(main):002:0> aa
=> 2
irb(main):003:0> self.aa
NoMethodError: private method `aa’ called for main:Object
from (irb):3
from /usr/lib/ruby/1.8/irb/workspace.rb:27
from :0
irb(main):004:0>
moulon%
Guy Decoux
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.