Hi -- On Sat, 19 Nov 2005, J. Merrill wrote: > uval wrote: >> Hello all, >> >> I am reading this page >> http://www.rubyist.net/~slagell/ruby/accesscontrol.html >> especially the "fish".square example >> >> I am puzzled by different behaviours of ruby itself and the irb >> >> irb(main):101:0> def square x >> irb(main):102:1> x*x >> irb(main):103:1> end >> => nil >> irb(main):105:0> [].square 12 >> => 144 >> irb(main):106:0> "fish".square 12 >> => 144 >> irb(main):112:0> "fish".public_methods.grep /square/ >> => ["square"] >> irb(main):113:0> "fish".private_methods.grep /square/ >> => [] >> >> I can square my fishes and arrays ;) >> but a ruby program >> >> #!/usr/bin/env ruby >> def square x >> x*x >> end >> >> puts square 10 >> #puts "fish".square # error, cant square fishes >> puts Object.private_methods.grep /square/ # yes it's there >> puts Object.public_methods.grep /square/ # nope >> >> >> 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. 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. David -- David A. Black dblack / wobblini.net