Thread overview
"name" of enum members
Feb 11, 2011
spir
Feb 11, 2011
Jesse Phillips
Feb 11, 2011
spir
Feb 11, 2011
Jesse Phillips
Feb 11, 2011
bearophile
Feb 11, 2011
spir
February 11, 2011
Hello,

To denote a member 'm' of an enum 'e', one needs to write "e.m". Is there a way to get back this "name"?
Here are my best trials:

unittest {
    enum TC : uint {i=1};
    writefln("%s   %s   %s", TC.i, TC.i.stringof, to!string(TC.i));
}
==>
1   cast(TC)1u   i

A bit strange that '%s' does not produce the same string as to!string... Anyway, the only solution seems to be parsing the result of stringof to get what's inside (), then compose it with the result of to!string: a bit too much of a burden, what do you think?
Hints welcome :-)

Thank you for reading,
Denis
-- 
_________________
vita es estrany
spir.wikidot.com

February 11, 2011
spir Wrote:

> Hello,
> 
> To denote a member 'm' of an enum 'e', one needs to write "e.m". Is there a way
> to get back this "name"?
> Here are my best trials:

Maybe to!string(Enum.i) should return the enum name with it's field. This makes since because it is trying to return its name, and for named enums, where it comes from is important.
February 11, 2011
On 02/11/2011 06:49 PM, Jesse Phillips wrote:
> spir Wrote:
>
>> Hello,
>>
>> To denote a member 'm' of an enum 'e', one needs to write "e.m". Is there a way
>> to get back this "name"?
>> Here are my best trials:
>
> Maybe to!string(Enum.i) should return the enum name with it's field. This makes since because it is trying to return its name, and for named enums, where it comes from is important.

That's what I wrote, precisely (see example in OP), and it returns only "i".

denis
-- 
_________________
vita es estrany
spir.wikidot.com

February 11, 2011
spir:

> To denote a member 'm' of an enum 'e', one needs to write "e.m". Is there a way to get back this "name"?

Is this good enough?

import std.stdio, std.conv;
enum TC { A, B, C }
void main() {
    writeln(typeof(TC.A).stringof, ".", to!string(TC.A));
}


> A bit strange that '%s' does not produce the same string as to!string...

I agree, I have a bug report on this.

Bye,
bearophile
February 11, 2011
spir Wrote:

> On 02/11/2011 06:49 PM, Jesse Phillips wrote:
> > spir Wrote:
> >
> >> Hello,
> >>
> >> To denote a member 'm' of an enum 'e', one needs to write "e.m". Is there a way
> >> to get back this "name"?
> >> Here are my best trials:
> >
> > Maybe to!string(Enum.i) should return the enum name with it's field. This makes since because it is trying to return its name, and for named enums, where it comes from is important.
> 
> That's what I wrote, precisely (see example in OP), and it returns only "i".

It look like you were asking how you could do it, not that to!string should do it for you. My thought is added it to bugzilla.
February 11, 2011
On 02/11/2011 07:39 PM, bearophile wrote:
> spir:
>
>> To denote a member 'm' of an enum 'e', one needs to write "e.m". Is there a way
>> to get back this "name"?
>
> Is this good enough?
>
> import std.stdio, std.conv;
> enum TC { A, B, C }
> void main() {
>      writeln(typeof(TC.A).stringof, ".", to!string(TC.A));
> }

Yo! thank you Bearophile.

>> A bit strange that '%s' does not produce the same string as to!string...
>
> I agree, I have a bug report on this.

More generally, I think default %s and to!string should systematically output the literal notation able to reconstruct the string'ed element. I mean, as far as possible without getting into much complication (in cases of struct or class object, which often have data members not read in by the contructor).
About the annoying case of strings, is there a tool func somewhere to reconstruct an escaped version? (like eg when the string holds '"') I have looked for it without success. Else, i guess Phobos very much needs that. (the equivalent of python's %r or repr() for strings)

Simple, clear, consistent, informative, useful.

Denis
-- 
_________________
vita es estrany
spir.wikidot.com