'new' class method
    bearophile 
    bearophileHUGS at lycos.com
       
    Thu Oct 23 02:32:00 PDT 2008
    
    
  
In Python to create new instances of a class you use the normal function call syntax, this allows you to use them as factory functions:
class C:
    def __init__(self, id):
        self.id = id
    def __repr__(self):
        return "<%s>" % self.id
seq = map(C, [1, -5, 10, 3])
That creates an array (list) of four objects.
In D with a map() you can do something similar:
import d.all;
import std.string: format;
class C {
    int id;
    this(int id) {
        this.id = id;
    }
    string toString() {
        return format("<%s>", this.id);
    }
    static C opCall(int id) {
        return new C(id);
    }
}
void main() {
    auto seq = map((int id){return new C(id);}, [1, -5, 10, 3]);
    putr(seq);
}
You can use the opCall method in a more direct way:
    auto seq2 = map(&(C.opCall), [1, -5, 10, 3]);
    putr(seq2);
But probably even better is to replace the current new syntax with a class method that creates the instances (I think the Ruby language has such syntax):
    auto seq3 = map(C.new, [1, -5, 10, 3]);
    putr(seq3);
With that normal code like:
new Foo(10, 20)
becomes:
Foo.new(10, 20)
Not a big change but allows a more functional style of coding.
Bye,
bearophile
    
    
More information about the Digitalmars-d
mailing list