2012-09-05 2 views
7

나는 다음 코드를 컴파일하려고 : std.algorithm.joiner (string [], string) - result 요소가 char가 아니고 dchar 인 이유는 무엇입니까?

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 
} 

dmd와 컴파일 오류로 종료

:

test.d(8): Error: cannot implicitly convert expression (joiner(x,space).front()) of type dchar to char 

dchar z-char z 오류 메시지를 해결하지 변경,하지만이 나타납니다 왜 관심 처음.

joiner(string[],string).front()의 결과는 char가 아니고 dchar입니까?

답변

11

모든 문자열이 dchar의 범위로 처리됩니다 (문서 http://dlang.org/phobos/std_algorithm.html#joiner이 아무것도 없다). 이는 UTF-32 (UTF-8 (char) 및 UTF-16 (wchar))에서 코드 당 코드 단위의 수는이므로 단일 코드 포인트가 보장되기 때문입니다. 포인트가 다릅니다. 따라서 개별 char 또는 wchar으로 작업하는 경우 전체 문자가 아닌 문자로 작동하게되므로 매우 좋지 않습니다. 유니 코드에 대해 잘 모르는 경우, Joel Spolsky가 this article을 읽는 것이 좋습니다. 그것은 꽤 잘 설명합니다. 어떤 경우

, 개별 char들과 wchar의에서 작동하는 것은 이해가되지 않기 때문에, charwchar의 문자열을 의미 dchar의 범위 ( ElementType!stringdchar이다)으로서 처리됩니다까지 범위가, 그들은을 걱정하는 ( hasLength!stringfalse입니다 - 그 길이를 얻기 위해 사용되는 walkLength 필요) length이없는, ( isRandomAccess!stringfalse입니다) ( hasSlicing!stringfalse입니다) sliceable하지 않고, 색인 없습니다. 이것은 또한 모든 종류의 문자열에서 새로운 범위를 만드는 것이 dchar의 범위가 될 것이라는 것을 의미합니다. joiner 중 하나입니다. 유니 코드 및 특수 사례 문자열을 이해하고 길이, 슬라이싱 및 인덱싱을 활용하여 효율성을 높이는 몇 가지 기능이 있지만 결과가 궁극적으로 원본 조각이 아니면 반환 할 범위를 만들어야합니다 dchar s.

따라서 모든 문자 범위의 front은 항상 dchar이고, popFront은 항상 전체 코드 포인트를 나타냅니다.

범위에 대해 잘 모르는 경우 this을 읽는 것이 좋습니다. 그것은 온라인에있는 D 책의 한 장이며 현재 우리가 가지고있는 범위에 관한 최고의 튜토리얼입니다. dlang.org에 실제로 문자열을 사용하는 방법을 포함하여 적절한 항목을 가져야하지만 아직 작성하는 사람은 아무도 없습니다. 그럼에도 불구하고 많은 D의 표준 라이브러리 (특히 std.algorithm)를 사용할 수 있으려면 범위를 최소한 기본으로 파악해야 할 필요가있을 것입니다. 왜냐하면 매우 광범위하게 사용하기 때문입니다.