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

Jimmy Schementi Jimmy.Schementi at microsoft.com
Tue Jun 29 14:58:31 EDT 2010


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 do:

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



More information about the Ironruby-core mailing list