2013-11-07 3 views
2

Каково состояние и планы по типу безопасности переписей в D?Тип перечисления безопасности в D

я ожидал

import std.stdio: writeln; 

void main(string args[]) { 
    enum E {x, y, z} 
    E e; 
    writeln(e); 
    e = cast(E)3; 
    writeln(e); 
} 

потерпеть неудачу собрать из двойки в противном случае сильного типа проверки статического/диапазона или, по крайней мере, дать RangeException при запуске.

К моему удивлению, вместо этого печатает

cast(E)3 

Является ли это действительно предпочтительное поведение по умолчанию для большинства случаев использования? Если это так, кто-нибудь написал какой-то тип-оболочку, обеспечивающий более строгую проверку диапазона, желательно во время компиляции?

+2

перечисления часто также используются в качестве флагов, а 'cast' - это флаг, что некоторые вещи могут не пройти правильно и возвращать нечетные значения –

ответ

5

cast означает, что вы берете дело в свои руки, и вы можете с ним что-либо делать - полезно, как сказал трепетный урод, для объединения флагов. (Хотя в тех случаях я хотел бы дать точный тип и явные значения для каждого элемента, чтобы убедиться, что все делает то, что я хочу, поэтому перечисление: ubyte {x = 1, y = 2, z = 4}, такого рода вещь)

во всяком случае, есть способ, чтобы получить исключение времени выполнения, хотя в таком случае, как это: использование std.conv.to:

import std.conv; 
import std.stdio; 

void main() { 
    enum E {x, y, z} 
    E e; 
    writeln(e); 
    e = to!E(2); // gives z, whereas to!E(3) throws an exception 
    writeln(e); 
} 

Прохладный факт: Е (строка) также работает. to! E ("x") == E.x и to! string (E.x) == "x".

+0

Но делает это! E (« cast (E) 3 ») работает? : p – BioTronic

+0

Один быстрый тест позже: Нет, это не так. : p – BioTronic

+0

Путь к! enum (string) и наоборот реализован относится к другому вопросу об отражении enum: они проверяют строки allMembers, так что это хороший белый список. (говоря о белых списках, я фактически использую enums в своих webapps для этого: мой web.d может автоматически создавать