Выход из безопасности с помощью отладочных операторов
Я знаю
debug writeln("Some good debug message")
в pure
функции, но как насчет функций, которые я тщательно пометил как @safe
или же @trusted
? DMD в настоящее время не позволяет debug writeln
в тех, потому что writeln
и аналогичные в настоящее время @system
, Это ИМХО очень расстраивает. Есть ли умный способ избежать безопасности или я должен временно закомментировать все мои @safe
а также @trusted
теги?
2 ответа
Решение
Что я делаю, так это делаю свой собственный @trusted debug_writeln.
@trusted void debug_writeln(T...)(T t) {
import std.stdio;
writeln(t);
}
Поскольку это @trusted, он будет работать внутри функций @safe без каких-либо изменений. Вы также можете просто назвать его writeln, а затем не импортировать std.stdio или псевдоним для принудительного устранения неоднозначности.
Универсальное решение
import std.stdio;
void main () @safe pure
{
auto str = trustedPureDebugCall!readln();
trustedPureDebugCall!writeln(str);
}
debug auto trustedPureDebugCall (alias fn, A...) (A args) @trusted pure
{
debug return fn(args);
}