August 10, 2015 findSplit corner case bug? | ||||
|---|---|---|---|---|
| ||||
Although it is a bit of a corner case, I would argue that the following behaviour is buggy:
assert(findSplit!(reverseArgs!canFind)("078.12.13-4.5", ".-") == tuple("078", ".1", "2.13-4.5"));
To understand why, consider the following more explicit code:
void main()
{
static bool oneOf(dchar a, string b)
{
bool r = false;
foreach(c; b)
{
if(c == a)
{
r = true;
break;
}
}
writefln(`matching a='%s' b="%s" returns %s`, a, b, r);
return r;
}
auto s = findSplit!oneOf("078.12.13-4.5", ".-");
writefln("%s %s %s", s[0], s[1], s[2]);
}
Output:
matching a='0' b=".-" returns false
matching a='7' b=".-" returns false
matching a='8' b=".-" returns false
matching a='.' b=".-" returns true
078 .1 2.13-4.5
The findSplit documentation says: "result[1] is the portion of haystack that matches needle". Yet, the only character for which the predicate returned true was '.'. Therefore, that should be the only part of result[1]. The alternative would be to clarify and change the documentation, I guess.
BTW 1: it's not very clear what the predicate arguments are / can be, unless I missed some part of the docs. Apparently, findSplit tries to use both `bool function(dchar, dchar)` and `bool function(dchar, string)`, IIRC.
BTW 2: Any particular reason for binaryReverseArgs to exist, instead of always just using reverseArgs?
| ||||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply