From: Brandon Dimcheff Date: 2008-10-08T00:32:41+09:00 Subject: Re: Difference between Foo = Class.new and class Foo matz, I don't think I'm doing conceptually different things below. I'm looking at creating and defining classes, not creating objects from those classes. I'm attempting to create a class called Foo in both cases. The first time, I use the class keyword. The second time, I call Class.new. It seems that using the class keyword doesn't call Class's metaclass's "new" method, while Class.new (obviously) does. Thanks, Brandon On Oct 7, 2008, at 10:57, Yukihiro Matsumoto wrote: > Hi, > > In message "Re: Difference between Foo = Class.new and class Foo" > on Tue, 7 Oct 2008 23:51:03 +0900, Brandon Dimcheff > writes: > > |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? > > I think you're comparing the different code. See the following code: > > class Foo > class << self > def new > puts "foo new called" > super > end > end > end > > Foo.new > > > Bar = Class.new do > class << self > def new > puts "bar new called" > super > end > end > end > > Bar.new > -- > matz. >