Object initializers
simendsjo
simendsjo at gmail.com
Sun Jan 8 07:15:43 PST 2012
C# has Object Initializers:
http://msdn.microsoft.com/en-us/library/bb384062.aspx
Java has Double Brace Initializers:
http://www.c2.com/cgi/wiki?DoubleBraceInitialization
D has with: http://dlang.org/statement.html#WithStatement
The nice thing about object initializers is that you can initialize
properties not supported by ctor in-place:
someFunction(new C { property = value });
or
new C {
d = new D { /*something*/ }
}
Are there a good D idom to do something like this? I'm pretty sure
someone can write some template magic to match the capabilities of C#
though :)
This is a little test using mixin (which obviously isn't of any real use)
T init(T, string Q, A...)(A params) {
auto c = new T(params);
with(c) {
mixin(Q);
}
return c;
}
class C {
int _i;
@property void prop(int i) { _i = i; }
string _a;
int _b;
this(string a, int b) {
_a = a;
_b = b;
}
}
void main() {
auto c = init!(C, q{ prop = 10; })("a", 2);
assert(c._i == 10);
assert(c._a == "a");
assert(c._b == 2);
}
Or with a delegate instead:
T init(T, A...)(void delegate(T) dg, A params) {
auto c = new T(params);
dg(c);
return c;
}
auto c = init!(C)((C o) { o.prop = 10; }, "a", 2);
Extremely ugly and hard to read :)
More information about the Digitalmars-d-learn
mailing list