Andrei Alexandrescu による Dの優れた 3 つの可能性が低い機能を参照した後、次のように、そこで与えられた回文アルゴリズムをテストしました。
import std.exception;
bool isPalindrome(T)(T[] a)
{
for (; a.length > 1; a = a[1 .. $-1]) {
if (a[0] != a[$-1]) {
return false;
}
}
return true;
}
bool isPalindrome(Range)(Range r)
{
for (; !r.empty; r.popFront(), r.popBack()) {
if (a.front != a.back) {
return false;
}
}
return true;
}
unittest {
enforce(isPalindrome("dallassallad"));
}
配列バージョンは文字列に対して正常に機能しますが、範囲バージョンを同じコンパイル ユニットに追加すると、DMD (2.062) が文句を言います:
palindrome.d(31): Error: template palindrome.isPalindrome matches
more than one template declaration,
palindrome.d(10):isPalindrome(T)(T[] a) and
palindrome.d(20):isPalindrome(Range)(Range r)
私の推測では、配列のケースを含まないように範囲の使用を制限することです。それ、どうやったら出来るの?
アレイバージョンを削除することもテストしましたが、エラーが発生しました
/home/per/Work/cognia/palindrome.d(22): Error: no property 'empty' for type 'string'
/home/per/Work/cognia/palindrome.d(22): Error: undefined identifier 'popFront'
/home/per/Work/cognia/palindrome.d(22): Error: undefined identifier 'popBack'
/home/per/Work/cognia/palindrome.d(23): Error: undefined identifier a, did you mean variable r?
/home/per/Work/cognia/palindrome.d(23): Error: undefined identifier a, did you mean variable r?
/home/per/Work/cognia/palindrome.d(27): Warning: statement is not reachable
/home/per/Work/cognia/palindrome.d(31): Error: template instance palindrome.isPalindrome!(string) error instantiating
奇妙だと思う配列では、範囲バージョンが機能しないようです。
何をすべきか?