我尝试编译以下代码:
import std.algorithm;
void main()
{
string[] x = ["ab", "cd", "ef"]; // 'string' is same as 'immutable(char)[]'
string space = " ";
char z = joiner( x, space ).front(); // error
}
Run Code Online (Sandbox Code Playgroud)
dmd带有错误的结尾编译:
test.d(8): Error: cannot implicitly convert expression (joiner(x,space).front()) of type dchar to char
Run Code Online (Sandbox Code Playgroud)
更改char z为dchar z确定错误消息,但我很感兴趣,为什么它出现在第一位.
为什么结果joiner(string[],string).front()是dchar而不是char?
(文档http://dlang.org/phobos/std_algorithm.html#joiner中没有任何内容)
只是浏览digitalmars.D.learn论坛和StackOverflow上与D相关的问题,在我看来,初学者D程序员(包括我)的一个主要错误点是char,wchar,dchar的使用和能力的差异,以及相关的字符串类型.这会导致以下问题:
我知道它必须是出于向后兼容性的原因和对来自C++或C的开发人员的熟悉程度,但我认为可以提出一个相当令人信服的论点,即当这些开发人员尝试一些非平凡的事情时,这些可能的收益会被这些问题所抵消.使用char或string并期望它在C/C++中工作,只是让它以难以调试的方式失败.
为了避免很多这些问题,我已经看到D开发社区的有经验的成员一次又一次地告诉没有经验的编码人员使用dchar来避免这样的问题,这就引出了为什么char不是32位的问题默认情况下为unicode字符,将8位ASCII字符降级为achar或类似名称,仅在必要时才触及?
如果我尝试使用std.algorithm.fill(Range1,Range2)(Range1范围,Range2填充),我会不断收到错误消息,表明找不到模板匹配.看起来编译器试图匹配fill(Range,Value)而不是另一个.
auto test = new char[256];
fill(test, "abc".dup);
Run Code Online (Sandbox Code Playgroud)
是否无法使用填充填充字符数组?
错误
test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))与任何函数模板声明都不匹配
test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))不能从参数类型推导出emplate函数!( )(炭[],CHAR [])