[Ironruby-core] Calling constructor when static .New() method is defined

Jimmy Schementi Jimmy.Schementi at microsoft.com
Tue Jun 29 15:42:47 EDT 2010


I said "#new" in some places where I shouldn't have ... so corrected below in case there was some confusion ...
 
> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-
> bounces at rubyforge.org] On Behalf Of Jimmy Schementi
> Sent: Tuesday, June 29, 2010 11:59 AM
> To: ironruby-core at rubyforge.org
> Subject: Re: [Ironruby-core] Calling constructor when static .New() method is
> defined
> 
> Philippe Leybaert wrote:
> > But I personally think this behavior is completely wrong. Calling .new from
> > IronRuby should always call the constructor, not a static method named
> > .New() that happens to exist somewhere in the class hierarchy. (if the
> > .New() method is defined in a base class, you get the same problem).
> 
> "new" is just a Ruby method on the Class object, which Ruby happens to call
> to construct an object. Because it's just a method, it can be overridden. For
> example, a Ruby class's .new can be overridden to return ANY object.
> 
> >>> class Foo
> ...   def self.new
> ...     42
> ...   end
> ... end
> => nil
> >>> Foo.new
> => 42
> >>> Foo.new.class
> => Fixnum
> >>>
> 
> So, anywhere in the class hierarchy, .new can be overridden. For example, if
> a base class overrides new, it does so for all its subclasses also, just as normal
> inheritance tells it to:
> 
> >>> class Bar < Foo
> ... end
> => nil
> >>> Bar.new
> => 42
> 
> At a high-level, the way IronRuby's .NET interop works is by treating any
> .NET-based code as if it were Ruby code, so a CLR Type will be shown as a
> Ruby Class. Therefore, defining a "New" method in C# is the moral
> equivalent of defining "new" on any Ruby class, which will override
> Class#new, which in turn overrides the CLR .ctor. Which is why "clr_new" is
> provided.
> 
> ~js
> 
> > -----Original Message-----
> > From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-
> > bounces at rubyforge.org] On Behalf Of Tomas Matousek
> > Sent: dinsdag 29 juni 2010 19:24
> > To: ironruby-core at rubyforge.org
> > Subject: Re: [Ironruby-core] Calling constructor when static .New() method
> is
> > defined
> >
> > You can call CLR constructor using "clr_new" method:
> >
> > Tester.clr_new
> >
> > Tomas
> >
> > -----Original Message-----
> > From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-
> > bounces at rubyforge.org] On Behalf Of Philippe Leybaert
> > Sent: Tuesday, June 29, 2010 9:57 AM
> > To: ironruby-core at rubyforge.org
> > Subject: [Ironruby-core] Calling constructor when static .New() method is
> > defined
> >
> > Shay Friedman suggested I'd post this to the mailing list, as it may be a bug
> in
> > IronRuby:
> >
> > It seems impossible to call a constructor when there is a static .New()
> > method defined on a class.
> >
> > This is a minimal test case demonstrating the problem:
> >
> > .NET (C#) class:
> >
> >     public class Tester
> >     {
> >         public static void New()
> >         {
> >             Console.WriteLine("In Tester.New()");
> >         }
> >
> >         public Tester()
> >         {
> >             Console.WriteLine("In constructor");
> >         }
> >     }
> >
> > IronRuby code:
> >
> >     Tester.new
> >     Tester.New
> >
> > The ruby code above calls Tester.New() in both cases. There seems to be
> no
> > way to call the regular constructor of this class.
> >
> > _______________________________________________
> > Ironruby-core mailing list
> > Ironruby-core at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/ironruby-core
> >
> > _______________________________________________
> > Ironruby-core mailing list
> > Ironruby-core at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/ironruby-core
> > _______________________________________________
> > Ironruby-core mailing list
> > Ironruby-core at rubyforge.org
> > http://rubyforge.org/mailman/listinfo/ironruby-core
> 
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core



More information about the Ironruby-core mailing list