Getting the class of an object

Consider;


class Dance
def foo
puts “foo is executed”
42
end
end

class Boogy < Dance
def bar
puts (foo.class)
end
end

b = Boogy.new

b.foo # prints “foo is executed” … expected.

b.bar # prints “foo is executed\nFixnum” … not expected!


Let’s focus on the line
puts (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
puts (foo.class)

Since everything in ruby is an object and all objects have classes, I’m
expecting to print out the class of this thing called foo.

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?
Is there a class called “Method” in the Ruby class hierarchy?
What class of object does define_method return?

Ralph S.

Are you talking about sth. like this:

b.method(:foo).owner #=> Dance
b.method(:bar).owner #=> Boogy

?

On Tue, Mar 6, 2012 at 11:34 AM, Ralph S. [email protected]
wrote:

b.bar # prints “foo is executed\nFixnum” … not expected!

Questions:
How can I tell what class of object foo is without executing it?
Is there a class called “Method” in the Ruby class hierarchy?
What class of object does define_method return?

Ralph S.


Best wishes,
Jie Fan

Life is a miracle.

Re[2]: Getting the class of an object.

ToMaTo,


The convention on this list is to bottom post.


Tuesday, March 6, 2012, 10:10:45 AM, you wrote:



Are you talking about sth. like this:


b.method(:foo).owner #=> Dance

b.method(:bar).owner #=> Boogy


?



On Tue, Mar 6, 2012 at 11:34 AM, Ralph S. <[email protected]> wrote:


Consider;


- - -


class Dance

   def foo

       puts "foo is executed"

       42

   end

end


class Boogy < Dance

   def bar

       puts (foo.class)

   end

end


b = Boogy.new


b.foo # prints "foo is executed" ... expected.


b.bar # prints "foo is executed\nFixnum" ... not expected!


- - -


Let's focus on the line

 puts (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

 puts (foo.class)


Since everything in ruby is an object and all objects have classes, I'm expecting to print out the class of this thing called foo.


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?

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

What class of object does define_method return?



Ralph S.







-- 


Best wishes,

Jie Fan

 

Life is a miracle.




TG>

TG> Are you talking about sth. like this:

TG>

TG> b.method(:foo).owner #=> Dance

TG> b.method(:bar).owner #=> Boogy

TG>

TG> ?




No.


Let's say I am examining the source code and I see "foo".  I don't know what it is.  Is it a method?  Is it a local variable?  Is it a proc passed in as something on the parameter list?  Is it a binding?


How can I find out what foo is without actually executing foo?

On Tue, Mar 6, 2012 at 5:34 PM, Ralph S. [email protected] wrote:

b.bar # prints “foo is executed\nFixnum” … not expected!
So I
puts (foo.class)

Since everything in ruby is an object and all objects have classes, I’m
expecting 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=0
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
=> nil
irb(main):040:0> Bogey.new.bar
foo → “method”
a → “local-variable”
none → nil
=> 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=” 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. :slight_smile:

Is there a class called “Method” in the Ruby class hierarchy?

irb(main):001:0> m = 1.method :to_s
=> #<Method: Fixnum#to_s>
irb(main):002:0> m.unbind
=> #<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 = Fixnum.send(:define_method, :foo) { 123 }
=> #<Proc:0x8666c84@(irb):4 (lambda)>
irb(main):005:0> x.class
=> Proc
irb(main):006:0> class Fixnum
irb(main):007:1> define_method(:bar){ 786 }
irb(main):008:1> end
=> #<Proc:0x8613840@(irb):7 (lambda)>

Cheers

robert

Hi,

I don’t really see why you are looking for Ruby code. Isn’t that more of
an IDE feature? In Netbeans, for example, you can click on an identifier
and jump to its declaration. There’s also a navigator for variables,
classes and constants.

Jacques

On Mar 6, 12:35pm, Ralph S. [email protected] wrote:

Let’s say I am examining the source code and I see “foo”. I don’t know what it
is. Is it a method? Is it a local variable? Is it a proc passed in as something on
the parameter list? Is it a binding?

How can I find out what foo is without actually executing foo?

If you’re examining the source code by looking at it? I’d hope it
should be fairly obvious.

If you’re doing something programmatically? Well, let me ask you
something in return: what are you planning to do with foo? What are
you planning to do with it if it’s a local variable? What if it’s a
method?

On 07/03/12 07:15, Robert K. wrote:

irb(main):039:1> end
=> nil
irb(main):040:0> Bogey.new.bar
foo -> “method”
a -> “local-variable”
none -> nil
=> nil
Great answer. I’m pretty new to Ruby and assumed that defined? returned
a boolean. That’ll learn me for not reading the manual.

Sam

methods that end in ? may not return a boolean, but they will return
something that’s ‘truthy’ or ‘falsy’:

$ irb
1.9.3p125 :001 > defined?(foo)
=> nil
1.9.3p125 :002 > if defined?(foo)
1.9.3p125 :003?> puts “Defined!”
1.9.3p125 :004?> end
=> nil
1.9.3p125 :005 > foo = “hello”
=> “hello”
1.9.3p125 :006 > defined?(foo)
=> “local-variable”
1.9.3p125 :007 > if defined?(foo)
1.9.3p125 :008?> puts “Defined!”
1.9.3p125 :009?> end
Defined!
=> nil

Sam,

Tuesday, March 6, 2012, 12:09:45 PM, you wrote:

SD> On 07/03/12 07:15, Robert K. wrote:

irb(main):039:1> end
=> nil
irb(main):040:0> Bogey.new.bar
foo -> “method”
a -> “local-variable”
none -> nil
=> nil
SD> Great answer. I’m pretty new to Ruby and assumed that defined?
returned
SD> a boolean. That’ll learn me for not reading the manual.

SD> Sam

Indeed, it is a great answer. Thanks Robert!

Now where in online documentation can I find where “defined?” is
documented?

I see it explained on page 137 of the Pickaxe book but is there more
formal documentation online?

Also … I find it interesting that I get a syntax error when I do
defined? defined?

Now where in online documentation can I find where “defined?” is documented?

http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-defined-3F

On 07/03/12 08:48, Ralph S. wrote:

irb(main):034:2> a=0
=> nil

Also … I find it interesting that I get a syntax error when I do
defined? defined?

Yeah, that is odd.

1.9.2p290 :001 > defined? defined?
SyntaxError: (irb):1: syntax error, unexpected $end
from ~/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in <main>' 1.9.2p290 :002 > defined?(defined?) SyntaxError: (irb):2: syntax error, unexpected ')' from ~/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in
1.9.2p290 :003 > defined? :defined?
=> “expression”

Sam

Jan,

Tuesday, March 6, 2012, 11:41:01 AM, you wrote:

JE> Hi,

JE> I don’t really see why you are looking for Ruby code. Isn’t that
more of
JE> an IDE feature? In Netbeans, for example, you can click on an
identifier
JE> and jump to its declaration. There’s also a navigator for variables,
JE> classes and constants.

JE> Jacques

I highly doubt if the IDE will pick up the definition of a variable if
it is dynamically created via some metaprogrmming dechniques.

Ralph

defined? is a INSN RTL, there for it’s not “defined” in the ruby script
lexical scope.
To be clearer - it’s Ruby keyword, not a method or whatever.

defined? is not a method - it’s a keyword, or it can be considered a a
built-in operator like “||” or “&&”.

– Matma R.