2015-08-01 3 views
3

В D я пытаюсь создать перечисление, члены которого имеют членов. Я могу лучше объяснить, что я пытаюсь сделать с примером, где s и i стоять в течение суб-членов я пытаюсь создать:enum constructors (создание членов группы)


В Python, я могу это сделать:

class Foo(enum.Enum): 
    A = "A string", 0 
    B = "B string", 1 
    C = "C string", 2 

    def __init__(self, s, i): 
     self.s = s 
     self.i = i 

print(Foo.A.s) 

Java может сделать что-то вроде этого:

public enum Foo { 
    A("A string", 0), 
    B("B string", 1), 
    C("C string", 2); 

    private final String s; 
    private final int i; 

    Foo(String s, int i) { 
     this.s = s; 
     this.i =i; 
    } 
} 

Как это сделать в D? Я ничего не вижу в официальном учебнике. Если по какой-то причине я не могу сделать это в D, какая хорошая альтернатива?

ответ

6

Вы можете создать перечисление с любым типом, здесь мы используем кортеж (как и python) с небольшим псевдонимом, чтобы его было легче набирать.

import std.stdio; 
import std.typecons; 

alias FooT = Tuple!(string, "s", int, "i"); 
enum Foo : FooT { 
    A = FooT("A string", 0), 
    B = FooT("B string", 1), 
    C = FooT("C string", 2), 
} 


void main(string[] args) { 
    writeln(Foo.A.s); 
}