digitalmars.D - findSplit corner case bug?
- =?UTF-8?B?Ikx1w61z?= Marques" (42/42) Aug 10 2015 Although it is a bit of a corner case, I would argue that the
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?
Aug 10 2015