5

スライス演算子を使用して、std.rangeからtake関数の戻り値のスライスを取得しようとしています。私のコード:

auto tempChunk = ['a', 'b', 'c', 'd'];
auto a = tempChunk.take(3);
writeln(a[0..2]);

この場合のTake!Rはchar []の単なるエイリアスなので、これがコンパイルされることを期待しています。しかし、コンパイラは私にそれを教えてくれTake!(char[]) cannot be sliced with []ます。別の例をとると:

int[] arr1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
auto s = arr.take(5);
writeln(s[0..4]);

これは問題なくコンパイルおよび実行され、[1、2、3、4、5]を出力します。最初の例が機能しないのに、2番目の例が機能する理由については、この時点で完全に混乱しています。

4

1 に答える 1

5

takeテンプレートはhasSlicingを使用して、Take!R構造体の代わりに入力のスライスを返すことができるかどうかを判断します。実際の返品タイプを確認すると、もう少し明確になります。

import std.range, std.stdio;

void main()
{
    auto chararr = ['a', 'b', 'c', 'd'];
    auto a = chararr.take(3);
    writeln( typeid(typeof(a)) );

    auto intarr = [ 1, 2, 3, 4 ];  
    auto b = intarr.take(3);
    writeln( typeid(typeof(b)) );
}

// Output:
// std.range.Take!(char[]).Take
// int[]

hasSlicingは、すべての「狭い文字列」に対してfalseを返すように明示的に指示されています。これらの要素は、単一の文字ではなく、コードポイント(charおよびwcharベースの文字列)を表す場合があります。

さて、ここから私の推測が始まりますが、スライスを使用して不正な形式のUTF-8&Co文字列が誤って作成されるのを防ぐために行われたと思います。char []が実際に必要ない場合は、dchar[]を使用することをお勧めします。

于 2012-10-22T19:00:54.770 に答える