「length」というローカル変数を使う際に注意すべきこと


import std.stdio;

int main()
{
static char str = "123456789";

// TEST 1
int length = search(str, '5');

writef("%s\n", str[0 .. length]);

// TEST 2
int len = search(str, '5');

writef("%s\n", str[0 .. len]);

return 0;
}

int search(char str, char c)
{
for (int i = 0; i < str.length; ++i) {
if (str[i] == c) {
return i;
}
}

return -1;
}
#--
>dmd length.d
>length
123456789
1234


上記のように変数名の違いで結果が変わる。
これは、配列の添え字内では、ローカル変数よりも配列のlengthプロパティが優先されるため、`length' -> str.lengthと解釈されるのが原因。