Первая версия, как правило, лучше. Там нет существенных различий в производительности компиляции (если они есть, 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 строк), вероятно, лучшее, что вы можете сделать.
Первая перемотка также лучше, если думать о интернационализации –