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.
Alle Monday 03 November 2008, exiquio ha scritto:
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
On 03.11.2008 17:11, Stefano C. wrote:
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
Can someone please explain to me what we gain by doing this?
robert
On Tue, 2008-11-04 at 02:48 +0900, Robert K. wrote:
On 03.11.2008 17:11, Stefano C. wrote:
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
Can someone please explain to me what we gain by doing this?
I am frequently converting Java code to Ruby using cut & paste. At most
the code needs about 10% changing to run, and the “new” operator is one
of those changes. If I didn’t have to do it, the first step of
converting, getting it to run, will go much faster.
I always convert completely to ruby conventions, but I appreciate being
able to do it in small steps.
If the new operator, and accessing class constants using Class.CONSTANT
was available, step 1 would be smaller.
I would only use this for development.