'new' class method

Yigal Chripun yigal100 at gmail.com
Thu Oct 23 04:47:27 PDT 2008


Bill Baxter wrote:
> On Thu, Oct 23, 2008 at 6:32 PM, bearophile
> <bearophileHUGS at lycos.com> wrote:
>> 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);
> 
> That would be  map(&(C.new), [1,-5,10,3]); wouldn't it?
> 
>> 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.
> 
> I like it.   Can we get rid of delete's specialness too?
> 
> Maybe just    delete(anInstance); Make it like a normal function too.
> Enabling things like
> 
> map(&delete, [obj1, obj2, obj3])
> 
> --bb

Andrei already mentioned that he wants to get read of new/delete IIRC.
I like Ruby's way of making it regular methods. something like:
obj.new(..) and obj.delete()
but, how do you specify stack vs heap allocation?
something like:
auto a = new S(); //on heap
auto b = S(); //on stack

also, what about placement new?



More information about the Digitalmars-d mailing list