It has a traditional very beautiful function: indexOf() but it has an important problem: returns -1 when it can't find 'c'...
void main()
{
enum chr = 'c';
auto arr = "dlang".dup;
if(auto res = arr.indexOf(chr))
{
assert(arr[res] == chr);
// core.exception.ArrayIndexError
}
}
When you try to solve the problem with boolean logic, res is now a bool.
void main()
{
enum chr = 'd';
auto arr = "dlang".dup;
if(auto res = arr.indexOf(chr) > -1)
{
assert(arr[res] == chr);
// core.exception.AssertError
}
}
We can solve this problem with an alternativeIndexOf, but we're sailing another problem: Rectified Index...
import std.stdio;
void main()
{
enum chr = 'c';
auto arr = "dlang".dup;
if(auto res = arr.rectifiedIndexOf(chr))
{
assert(arr[res - 1] == chr);
res.writefln!"[ --> %s ]";
} else writeln("Not found!");
}
auto rectifiedIndexOf(A)(A[] arr, A key)
{
size_t i = 1;
while(i <= arr.length)
{
if(arr[i - 1] == key)
{
return i;
}
else i++;
}
return 0;
}
So now that we've broken the traditional index approach, you need to consider this (res - 1) in your code.
SDB@79
Permalink
Reply