On Tue, Mar 6, 2012 at 5:34 PM, Ralph Shnelvar <ralphs / dos32.com> wrote:
> Consider;
>
> - - -
>
> class Dance
> =A0 =A0def foo
> =A0 =A0 =A0 =A0puts "foo is executed"
> =A0 =A0 =A0 =A042
> =A0 =A0end
> end
>
> class Boogy < Dance
> =A0 =A0def bar
> =A0 =A0 =A0 =A0puts (foo.class)
> =A0 =A0end
> end
>
> b =3D Boogy.new
>
> b.foo # prints "foo is executed" ... expected.
>
> b.bar # prints "foo is executed\nFixnum" ... not expected!
>
> - - -
>
> Let's focus on the line
> =A0puts (foo.class)
>
> So let's say I'm in the middle of a debugging session trying to debug the=
 bar method.
>
> I see this thing called "foo" and I want to know what it is.
>
> So I
> =A0puts (foo.class)
>
> Since everything in ruby is an object and all objects have classes, I'm e=
xpecting to print out the class of this thing called foo.

You do not want the class but rather the kind of "foo".  "local
variable" is not a class.  You can do

irb(main):032:0> class Bogey < Dance
irb(main):033:1> def bar
irb(main):034:2> a=3D0
irb(main):035:2> printf "foo -> %p\n", defined?(foo)
irb(main):036:2> printf "a -> %p\n", defined?(a)
irb(main):037:2> printf "none -> %p\n", defined?(none)
irb(main):038:2> end
irb(main):039:1> end
=3D> nil
irb(main):040:0> Bogey.new.bar
foo -> "method"
a -> "local-variable"
none -> nil
=3D> nil


> What happens, though is that foo gets executed (which is not what I want)=
 and returns 42 ... whose class is Fixnum.

> Questions:
> How can I tell what class of object foo is without executing it?

if you see "foo=3D" it's a local variable, if not it's a method or does
not exist.  If your method is so long that you cannot find anything
any more you need to refactor. :-)

> Is there a class called "Method" in the Ruby class hierarchy?

irb(main):001:0> m =3D 1.method :to_s
=3D> #<Method: Fixnum#to_s>
irb(main):002:0> m.unbind
=3D> #<UnboundMethod: Fixnum#to_s>

> What class of object does define_method return?

Why don't you try and see?  It's as easy as

irb(main):004:0> x =3D Fixnum.send(:define_method, :foo) { 123 }
=3D> #<Proc:0x8666c84@(irb):4 (lambda)>
irb(main):005:0> x.class
=3D> Proc
irb(main):006:0> class Fixnum
irb(main):007:1> define_method(:bar){ 786 }
irb(main):008:1> end
=3D> #<Proc:0x8613840@(irb):7 (lambda)>

Cheers

robert

--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/