Thread overview | ||||||
---|---|---|---|---|---|---|
|
July 07, 2011 Runtime evaluation | ||||
---|---|---|---|---|
| ||||
Hi guys, I'm trying to read a string from a text file which contains a value of an enumeration like: enum MyEnum : string { Entry_1 = "abc", Entry_2 = "def", Entry_3 = "ghi", } Stream s = new File("myFile.ext", FileMode.In); uint len; s.read(len); string entry = cast(string) s.readString(len); s.close(); writeln(mixin("MyEnum." ~ entry)); myFile.ext may contain: ... Entry_2 Entry_1 Entry_2 Entry_3 ... But mixin's are for compile time only... is there any chance to do this or do I've to use another method (like if/else or switch/case): if (entry == "Entry_1") ... else if (entry == "Entry_2") ... ... Thanks a lot! |
July 07, 2011 Re: Runtime evaluation | ||||
---|---|---|---|---|
| ||||
Posted in reply to nrgyzer | You could generate the if/else-chain, lookup table, etc. via metaprogramming to save you the typing and code duplication (probably a foreach over std.traits.EnumMembers will be involved).
David
On 7/7/11 11:23 PM, nrgyzer wrote:
> Hi guys,
>
> I'm trying to read a string from a text file which contains a value of an enumeration like:
>
> enum MyEnum : string {
> Entry_1 = "abc",
> Entry_2 = "def",
> Entry_3 = "ghi",
> }
>
> Stream s = new File("myFile.ext", FileMode.In);
> uint len;
> s.read(len);
> string entry = cast(string) s.readString(len);
> s.close();
>
> writeln(mixin("MyEnum." ~ entry));
>
> myFile.ext may contain:
> ...
> Entry_2
> Entry_1
> Entry_2
> Entry_3
> ...
>
> But mixin's are for compile time only... is there any chance to do this or do I've to use another method (like if/else or switch/case):
>
> if (entry == "Entry_1") ...
> else if (entry == "Entry_2") ...
> ...
>
> Thanks a lot!
|
July 08, 2011 Re: Runtime evaluation | ||||
---|---|---|---|---|
| ||||
Posted in reply to nrgyzer | Am 07.07.2011 23:23, schrieb nrgyzer: > Hi guys, > > I'm trying to read a string from a text file which contains a value of an enumeration like: > > enum MyEnum : string { > Entry_1 = "abc", > Entry_2 = "def", > Entry_3 = "ghi", > } > > Stream s = new File("myFile.ext", FileMode.In); > uint len; > s.read(len); > string entry = cast(string) s.readString(len); > s.close(); > > writeln(mixin("MyEnum." ~ entry)); > > myFile.ext may contain: > ... > Entry_2 > Entry_1 > Entry_2 > Entry_3 > ... > > But mixin's are for compile time only... is there any chance to do this or do I've to use another method (like if/else or switch/case): > > if (entry == "Entry_1") ... > else if (entry == "Entry_2") ... > ... > > Thanks a lot! Metaprogramming is the keyword but you don't have to do it yourself. Just use std.conv.to!MyEnum(string_without_the prefix). Mafi |
July 09, 2011 Re: Runtime evaluation | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mafi | == Auszug aus Mafi (mafi@example.org)'s Artikel > Am 07.07.2011 23:23, schrieb nrgyzer: > > Hi guys, > > > > I'm trying to read a string from a text file which contains a value of an enumeration like: > > > > enum MyEnum : string { > > Entry_1 = "abc", > > Entry_2 = "def", > > Entry_3 = "ghi", > > } > > > > Stream s = new File("myFile.ext", FileMode.In); > > uint len; > > s.read(len); > > string entry = cast(string) s.readString(len); > > s.close(); > > > > writeln(mixin("MyEnum." ~ entry)); > > > > myFile.ext may contain: > > ... > > Entry_2 > > Entry_1 > > Entry_2 > > Entry_3 > > ... > > > > But mixin's are for compile time only... is there any chance to do this or do I've to use another method (like if/else or switch/ case): > > > > if (entry == "Entry_1") ... > > else if (entry == "Entry_2") ... > > ... > > > > Thanks a lot! > Metaprogramming is the keyword but you don't have to do it yourself. > Just use std.conv.to!MyEnum(string_without_the prefix). > Mafi Thanks Mafi, exactly what I'm looking for :) |
Copyright © 1999-2021 by the D Language Foundation