digitalmars.D.learn - Member Access Based On A Runtime String
- Jack Stouffer (7/7) Feb 29 2016 In Python, I can do this:
- Mike Parker (4/11) Feb 29 2016 Not built-in. You would have do something similar to what the
- Andrea Fontana (5/12) Mar 01 2016 Maybe if string_from_func can be computed at compile time.
- Adrian Matoga (29/36) Mar 01 2016 struct Foo
- Adrian Matoga (2/3) Mar 01 2016 Oops, should be T : Q
- Jack Stouffer (2/30) Mar 01 2016 Thanks. This should be in Phobos
In Python, I can do this: my_obj = Obj() string_from_func = func() setattr(my_obj, string_from_func, 100) Say func() returns "member1" or "member2", the setattr would then set either one of those to 100. Is there any equivalent in D?
Feb 29 2016
On Tuesday, 1 March 2016 at 05:05:40 UTC, Jack Stouffer wrote:In Python, I can do this: my_obj = Obj() string_from_func = func() setattr(my_obj, string_from_func, 100) Say func() returns "member1" or "member2", the setattr would then set either one of those to 100. Is there any equivalent in D?Not built-in. You would have do something similar to what the Python interpreter does. Store pointers to the setter functions in an AA and use the member names as keys.
Feb 29 2016
On Tuesday, 1 March 2016 at 05:05:40 UTC, Jack Stouffer wrote:In Python, I can do this: my_obj = Obj() string_from_func = func() setattr(my_obj, string_from_func, 100) Say func() returns "member1" or "member2", the setattr would then set either one of those to 100. Is there any equivalent in D?Maybe if string_from_func can be computed at compile time. Something like this: http://dpaste.dzfl.pl/8bc21da1147a ?
Mar 01 2016
On Tuesday, 1 March 2016 at 05:05:40 UTC, Jack Stouffer wrote:In Python, I can do this: my_obj = Obj() string_from_func = func() setattr(my_obj, string_from_func, 100) Say func() returns "member1" or "member2", the setattr would then set either one of those to 100. Is there any equivalent in D?struct Foo { string foo = "dog"; int bar = 42; int baz = 31337; } void set(P, T)(ref P p, string name, auto ref T value) { foreach (mem; __traits(allMembers, P)) { static if (is(typeof(__traits(getMember, p, mem)) Q)) { static if (is(Q : T)) { if (mem == name) { __traits(getMember, p, mem) = value; return; } } } } assert(0, P.stringof ~ " has no member " ~ name); } unittest { Foo foo; foo.set("bar", 15); assert(foo.bar == 15); foo.set("foo", "cat"); assert(foo.foo == "cat"); }
Mar 01 2016
On Tuesday, 1 March 2016 at 08:53:20 UTC, Adrian Matoga wrote:static if (is(Q : T)) {Oops, should be T : Q
Mar 01 2016
On Tuesday, 1 March 2016 at 08:53:20 UTC, Adrian Matoga wrote:struct Foo { string foo = "dog"; int bar = 42; int baz = 31337; } void set(P, T)(ref P p, string name, auto ref T value) { foreach (mem; __traits(allMembers, P)) { static if (is(typeof(__traits(getMember, p, mem)) Q)) { static if (is(Q : T)) { if (mem == name) { __traits(getMember, p, mem) = value; return; } } } } assert(0, P.stringof ~ " has no member " ~ name); } unittest { Foo foo; foo.set("bar", 15); assert(foo.bar == 15); foo.set("foo", "cat"); assert(foo.foo == "cat"); }Thanks. This should be in Phobos
Mar 01 2016