D mixins со строковыми операторами - PullRequest
4 голосов
/ 31 июля 2011

У меня есть D-миксин, который я хотел бы использовать для генерации оператора switch (в частности, значений регистра) для строковых значений, но, несмотря на то, что KeyValues имеет записи в нем и предоставляет правильные значения ключа, регистр по умолчанию:всегда выполнялся только один:

class DataStore(KeyValues...) {
    void stringSetData(string key, string data) {
        switch(key) {
            foreach(D; KeyValues) {
                mixin("case \"" ~ D.Name ~ "\": set(to!(D.Type)(data)); break;");
            }
            default:
                throw new Exception("Invalid meta key"); break;
        }
    }
}

Я проверил это с жестко запрограммированными значениями, и это работает, как и ожидалось, поэтому я подозреваю, что я мог что-то не так делать с моим миксином.Как я могу заставить это работать как ожидалось?

1 Ответ

5 голосов
/ 31 июля 2011

break внутри миксина прерывается из цикла foreach, а не switch.Замените его на return или с пометкой break.

. Кстати, если вы попытаетесь скомпилировать этот код с включенными предупреждениями, вы получите несколько странных сообщений об ошибках из DMD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...