Alle Monday 03 November 2008, exiquio ha scritto:
> The following is the beginning of a Java-esque new operator.
>
> def new o
>   o.class == Class ? o.new : o
> end
>
> Used with the String class you can do:
>
> new String # => ""
> new String('foo') # => "foo"
>
> But this is not the case with a class like Object:
>
> new Object # okay
> new Object() # error
>
> My question is, what are classes like Array and String defining that
> Object isn't? And how can I define my own? Thanks in advanced.

The code

Object()

is interpreted as a method call to a method called Object passing no 
arguments. The same happens with String("abc") or Array('x'). The only reason 
for which the first doesn't work and the other two do is that methods called 
String and Array exist, while a method called Object doesn't.

I think the closest you can get to the Java syntax is this:

def new o, *args
  o.class == Class ? o.new(*args) : o
end

This method is called this way:

new String, "abc"
new Object

Beware, however, that there are classes without a new method, for example 
FixNum, BigNum, Float, NilClass, TrueClass, FalseClass, Symbol.

I hope this helps

Stefano