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 Shnelvar

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 Shnelvar <ralphs@dos32.com> 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 Shnelvar

--
Best wishes,
Jie Fan

Life is a miracle.

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.

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

···

On Tue, Mar 6, 2012 at 5:34 PM, Ralph Shnelvar <ralphs@dos32.com> wrote:

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

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

···

--
Posted via http://www.ruby-forum.com/.

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 Shnelvar ralphs@dos32.com 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 Shnelvar

Best wishes,

Jie Fan

Life is a miracle.

Are you talking about sth. like this:

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

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

?

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?

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

···

On 07/03/12 07:15, Robert Klemme wrote:

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

Jan,

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

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

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

Ralph

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 Mar 6, 12:35 pm, Ralph Shnelvar <ral...@dos32.com> 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?

--
-yossef

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:

···

On 07/03/12 07:15, Robert Klemme wrote:

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

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

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

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 `<main>'
1.9.2p290 :003 > defined? :defined?
  => "expression"

Sam

···

On 07/03/12 08:48, Ralph Shnelvar wrote:

Sam,

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

> On 07/03/12 07:15, Robert Klemme wrote:

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

> 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

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?

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.

···

On Mar 6, 2012, at 9:55 PM, Sam Duncan wrote:

On 07/03/12 08:48, Ralph Shnelvar wrote:

Sam,

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

> On 07/03/12 07:15, Robert Klemme wrote:

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

> 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

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?

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 `<main>'
1.9.2p290 :003 > defined? :defined?
=> "expression"

Sam

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

-- Matma Rex