маленькие радости
Mar. 28th, 2015 11:45 pmДобавил тут в одну программку простейшую конфигурацию: именованные параметры, загружаемые при первом обращении из текстового файла, и имеющие значения по-умолчанию на случай если файл конфигурации отсутствует или не содержит нужного значения. Потом заметил, что имена всех параметров указаны в исходниках, т.е. известны во время компиляции. А значит было бы неплохо прямо при компиляции убеждаться, что все запрашиваемые имена параметров верные, т.е. для каждого запрашиваемого параметра описано значение по-умолчанию, и нигде не будет ненароком запрошено что-нибудь неизвестное.
Делается просто. Добавляем еще одну пару скобок к функции получения значения из конфигурации, делая передаваемое имя параметра не рантайм-, а компайлтайм аргументом. Ассоциативный массив с ответами по-умолчанию делаем компайл-тайм константой (волшебное слово enum). В начало функции добавляем static if с проверкой (осуществляемой при компиляции) на наличие запрашиваемого имени в том ассоц.массиве. Если не найдено, говорим ругаться при компиляции такими-то словами. Все.
Теперь если допустить очепятку и написать
то программа не компилируется, а компилятор пишет
Мелочь, а приятно. За такие вот в том числе и люблю D.
Делается просто. Добавляем еще одну пару скобок к функции получения значения из конфигурации, делая передаваемое имя параметра не рантайм-, а компайлтайм аргументом. Ассоциативный массив с ответами по-умолчанию делаем компайл-тайм константой (волшебное слово enum). В начало функции добавляем static if с проверкой (осуществляемой при компиляции) на наличие запрашиваемого имени в том ассоц.массиве. Если не найдено, говорим ругаться при компиляции такими-то словами. Все.
string getOptionString(string name)() { static if (name !in defaults) { static assert(0, "unknown option name: " ~ name); } auto ops = getOptions(); return ops[name]; } private: enum defaults = ["quantity": "large", "quality" : "high"]; ...
Теперь если допустить очепятку и написать
string q = getOptionString!("quanlity");
то программа не компилируется, а компилятор пишет
options.d(5): Error: static assert "unknown option name: quanlity" main.d(210): instantiated from here: getOptionString!"quanlity"
Мелочь, а приятно. За такие вот в том числе и люблю D.