满堂花醉三千客,一剑霜寒十四州。这篇文章主要讲述d改进翻译相关的知识,希望能为你提供帮助。
??原文????结构?
?可以是??函子?
?:
private @safe struct TranslatableStringPlural
string _str, _strpl;
this(string s1, string s2)// 必须的!
_str = s1;
_strpl = s2;
string opCall(int n)
auto fmt = ngettext(_str, _strpl, n);
if (countFormatSpecifiers(fmt) == 0)
// 改进该行.
return ()@trusted return fromStringz(& (format(fmt~"\\0%s", n)[0])); ();
return format(fmt, n);
现在,变成:
private @safe struct Strplusarg
this(string s)
fmt = s;
auto fs = countFormatSpecifiers(fmt);
//修复这句.
assert(fs==0||fs==1,"无效");
hasArg = fs == 1;
string fmt;
bool hasArg;
private @safe struct TranslatableStringPlural
//...前略
string opCall(int n)
auto f = n == 1 ? _str : _strpl;
return f.hasArg ? format(f.fmt, n) : f.fmt;
【d改进翻译】原代码:
@safe: private:
int countFormatSpecifiers(string fmt) pure
int count = 0;
auto f = FormatSpec!char(fmt);
if (!__ctfe)
//有ctfe
while (f.writeUpToNextSpec(nullSink))
count++;
else
auto a = appender!string;
while (f.writeUpToNextSpec(a))
count++;
return count;
修复为:
@safe: private:
int countFormatSpecifiers(string fmt) pure
static void ns(const(char)[] arr)
// 最简输出区间.
auto nullSink = & ns;
int count = 0;
auto f = FormatSpec!char(fmt);
while (f.writeUpToNextSpec(nullSink))
count++;
return count;
推荐阅读
- 并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)
- 并发-原子操作和CAS(CompareAndSwep)
- Lambda表达式及双冒号操作符
- d的破坏与安全
- jQuery基础—— 解决jQuery冲突
- Mysql索引灵魂拷问
- d的嵌套赋值
- 并发-线程基础线程共享和协作
- d重载嵌套函数