Forum: Ruby irb and ruby

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.
8d6f5daee16e380ce0ac00395b417fb6?d=identicon&s=25 uval (Guest)
on 2005-11-18 02:34
(Received via mailing list)
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
1d6252c8fa730e6b9989db64df35103a?d=identicon&s=25 J. Merrill (j-merrill)
on 2005-11-18 18:02
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.

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.
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 dblack (Guest)
on 2005-11-18 18:13
(Received via mailing list)
Hi --

On Sat, 19 Nov 2005, J. Merrill wrote:

>> irb(main):102:1> x*x
>>
>> 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.


David
956f185be9eac1760a2a54e287c4c844?d=identicon&s=25 decoux (Guest)
on 2005-11-18 18:38
(Received via mailing list)
>>>>> "D" == David A Black <dblack@wobblini.net> writes:

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 topic is locked and can not be replied to.