2012-09-05 5 views
7

私は次のコードコンパイルしよう:dmdstd.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 
} 

コンパイルがエラーで終了します。dchar zからchar zを変更

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

はエラーメッセージを修正し、それがに表示されますなぜ私が興味を持っています最初の場所。

なぜjoiner(string[],string).front()の結果がdcharで、charではないのですか?

答えて

11

すべての文字列がdcharの範囲として扱われます(ドキュメントhttp://dlang.org/phobos/std_algorithm.html#joinerで、この上は何もありません)。これは、UTF-32(UTF-8(char)とUTF-16(wchar))では、コード単位のコード数がコードポイントであるため、dcharが単一のコードポイントであることが保証されているからです。ポイントは異なります。したがって、個別のcharまたはwcharで操作していた場合は、文字全体ではなく文字で操作することになり、非常に悪いことになります。あなたがユニコードについてよく知らないのなら、私はJoel Spolskyによってthis articleと読むことをお勧めします。それは事をかなりうまく説明します。いずれの場合においても

、個々 char sおよび wcharの上で動作する意味がないので、 charwcharの文字列は意味、 dcharの範囲( ElementType!stringdcharある)として扱われている限り範囲が、彼らを懸念しているとして、 ( hasLength!stringfalseある - その長さを取得するために使用される walkLengthニーズ) lengthを持っていない、( isRandomAccess!stringfalseある)( hasSlicing!stringfalseある)スライス可能なものではなく、刃先交換式ではありません。これは、任意の種類の文字列から新しい範囲を作成するものは、 dcharの範囲になることを意味します。 joinerの1つです。長さ、スライス、インデックスの機能を利用して効率を上げるために、ユニコードと特殊文字列を理解する関数がいくつかありますが、結果が最終的に元のスライスでない限り、返される範囲はすべて作らなければなりません dchar s。

したがって、任意の文字範囲のは常にdcharになり、popFrontは常に完全なコードポイントを表示します。

範囲があまりわからない場合は、thisをお読みください。これはオンライン上にあるDの本の章であり、現在私たちが持っている範囲に関するベストチュートリアルです。 dlang.orgに範囲に関する適切な記事(文字列の使い方を含む)を実際に取得する必要がありますが、誰もまだそれを書いている人はいません。それにもかかわらず、Dの標準ライブラリ(特にstd.algorithm)の多くを使用できるようにするためには、範囲の基本的な把握が必要です。

関連する問題