Difference between Foo = Class.new and class Foo

  • Thread starter Brandon Dimcheff
  • Start date
B

Brandon Dimcheff

I'm playing around with classes and discovered that

class Foo
...
end

and

Foo = Class.new do
...
end

seem to behave slightly differently. I assumed that "class Foo" was
just a shortcut that got translated into "Foo = Class.new", but when I
muck with class in the following way:

class Class
class << self
def new
puts "new called"
super
end
end
end

and then do "Foo = Class.new", I get "new called" printed to stdout.
If I do "class Foo..." I get nothing. So it seems that the "class"
keyword does not end up calling new on Class when you define a new
class. Does anybody know what's going on here? Is something else
called instead?

Thanks,
Brandon
 
R

Robert Klemme

2008/10/7 Brandon Dimcheff said:
and then do "Foo = Class.new", I get "new called" printed to stdout. If I
do "class Foo..." I get nothing. So it seems that the "class" keyword does
not end up calling new on Class when you define a new class. Does anybody
know what's going on here? Is something else called instead?

Looks like there is a shortcut:

16:55:57 bas$ ruby -e 'set_trace_func lambda {|*a|p a}; class Foo;end'
["line", "-e", 1, nil, #<Binding:0x1002f0d4>, false]
["c-call", "-e", 1, :inherited, #<Binding:0x1002ef80>, Class]
["c-return", "-e", 1, :inherited, #<Binding:0x1002ef44>, Class]
["class", "-e", 1, nil, #<Binding:0x1002ed64>, false]
["end", "-e", 1, nil, nil, false]
16:56:13 bas$ ruby -e 'set_trace_func lambda {|*a|p a}; Foo=Class.new'
["line", "-e", 1, nil, #<Binding:0x1002f0e8>, false]
["c-call", "-e", 1, :new, #<Binding:0x1002f0ac>, Class]
["c-call", "-e", 1, :initialize, #<Binding:0x1002eeb8>, Class]
["c-call", "-e", 1, :inherited, #<Binding:0x1002edb4>, Class]
["c-return", "-e", 1, :inherited, #<Binding:0x1002ed78>, Class]
["c-return", "-e", 1, :initialize, #<Binding:0x1002ec88>, Class]
["c-return", "-e", 1, :new, #<Binding:0x1002eb98>, Class]
16:56:44 bas$

If you need hooks for class creation look closely at ":inherited" above.

Kind regards

robert
 
B

Brandon Dimcheff

hmm, interesting. I'm definitely going to have to use set_trace_func
more often. Do you know if there's any way to tell which c function
is being called for the c-calls? Like how does the ruby method
"inherited" map to rb_... in MRI?

Thanks,
Brandon

2008/10/7 Brandon Dimcheff said:
and then do "Foo = Class.new", I get "new called" printed to
stdout. If I
do "class Foo..." I get nothing. So it seems that the "class"
keyword does
not end up calling new on Class when you define a new class. Does
anybody
know what's going on here? Is something else called instead?

Looks like there is a shortcut:

16:55:57 bas$ ruby -e 'set_trace_func lambda {|*a|p a}; class Foo;end'
["line", "-e", 1, nil, #<Binding:0x1002f0d4>, false]
["c-call", "-e", 1, :inherited, #<Binding:0x1002ef80>, Class]
["c-return", "-e", 1, :inherited, #<Binding:0x1002ef44>, Class]
["class", "-e", 1, nil, #<Binding:0x1002ed64>, false]
["end", "-e", 1, nil, nil, false]
16:56:13 bas$ ruby -e 'set_trace_func lambda {|*a|p a}; Foo=Class.new'
["line", "-e", 1, nil, #<Binding:0x1002f0e8>, false]
["c-call", "-e", 1, :new, #<Binding:0x1002f0ac>, Class]
["c-call", "-e", 1, :initialize, #<Binding:0x1002eeb8>, Class]
["c-call", "-e", 1, :inherited, #<Binding:0x1002edb4>, Class]
["c-return", "-e", 1, :inherited, #<Binding:0x1002ed78>, Class]
["c-return", "-e", 1, :initialize, #<Binding:0x1002ec88>, Class]
["c-return", "-e", 1, :new, #<Binding:0x1002eb98>, Class]
16:56:44 bas$

If you need hooks for class creation look closely at ":inherited"
above.

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,241
Members
46,831
Latest member
RusselWill

Latest Threads

Top