2013-09-01 11 views
1

Каков предпочтительный способ построения строк в отношении атрибутов функции @safe, pure и nothrow и времени выполнения и времени выполнения во время выполнения функции родительского контроля?Предпочтительный способ построения строк в D

Если мы либо использовать, например

format("Variable x=%s should equal %s", x, x_) 

или

"Variable x=" ~to!string(x)~ " should equal " ~to!string(x_) 

Я считаю, версия format легче на глаз, но это лучше, в других отношениях?

Может быть небольшой удар по производительности во время компиляции, потому что строки формата и его аргументы должны быть CTFEed правильно?

+1

Первая перемотка также лучше, если думать о интернационализации –

ответ

1

Первая версия, как правило, лучше. Там нет существенных различий в производительности компиляции (если они есть, forrmat не является ctfe), а format() должен фактически работать лучше.

Бинарный «foo» ~ «bar» часто является неожиданно дорогостоящим, потому что он выделяет промежуточные результаты, которые затем собирает сборщик мусора.

На версии dmd у меня есть, ни одна версия фактически не компилируется как безопасная, но не черная, чистая. Я думаю, они исправили это в phobos git, но я не уверен. Несмотря на это, прямо сейчас ни на самом деле не работает, и нет простого решения, помимо реализации вашей собственной функции, если только это не просто для отладки. .

Чистое требование расслаблен в отладочных отчетности, и вы можете обернуть не- @ безопасных функций в @system и бросать функции TRY/улова, чтобы получить эти атрибуты в

Таким образом, это будет на самом деле компиляции:

// trusted gets around safe 
@trusted pure nothrow string myformat(T...)(in string fmt, in T t) { 
import std.string; 
    // debug gets around the pure requirement 
debug try // try gets around nothrow 
    return format(fmt, t); 
catch(Exception e) { } 

return null; 
} 

@safe nothrow pure void main() { 
import std.conv; 
string s = myformat("test %s", 10); 
    assert(0, s); // the assert message shows up 
} 

компилировать с переключателем -debug: DMD test.d -debug

Так не отличное решение, но пока функции Фобоса с соответствующими атрибутами не будут освобождены, или если вы хотите написать свой собственный format() или to() (не очень t hard, вы можете сделать int для строки в < 10 строк), вероятно, лучшее, что вы можете сделать.

+2

В формате git-head чисто (так что это будет чистым в предстоящем выпуске 2.064). Он также полностью можно использовать в CTFE, но это также верно с момента выпуска или два назад. –

+0

Отличные ответы. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^