On Sunday 09 January 2011 10:44:39 Andrei Alexandrescu wrote: > On 1/9/11 10:28 AM, Pelle wrote: > > On 01/09/2011 03:07 AM, Robert Clipsham wrote: > >> On 08/01/11 23:20, bearophile wrote: > >>> Andrei has recently closed issue 1323, it's a small but very useful > >>> feature, so I suggest some public discussion: > >>> http://d.puremagic.com/issues/show_bug.cgi?id=1323 > >>> > >>> Lines like this is present thousands of time in my Python code: > >>> n in [1, 2, 3] > >>> c in "hello" > >>> "llo" in some_string > >>> > >>> Bye, > >>> bearophile > >> > >> I'd be all for this, except it's inconsistent. > >> ---- > >> auto arr = [ "foo" : 1, "bar" : 2 ]; > >> assert("foo" in arr); > >> ---- > >> in for associative arrays works by key, if it works by value for normal > >> arrays it's inconsistent, and if it works for keys people will wonder > >> why it's not working as expected. > > > > No, people will not wonder about that. See also: python. Seriously > > people, stop giving this as a reason. > > > > A much better argument is the in operator should run in O(log n) for > > anything, meaning it won't work for a general unsorted array. > > > > I suggest going for (v in assumeSorted(arr)) or (arr.contains(v)), where > > contains is the canFind function blessed with a new, superior name. :-) > > I'd be glad to change canFind to contains. Vote by replying to this. We > can put canFind on the slow deprecation chute. > > Andrei
I would remind you of http://d.puremagic.com/issues/show_bug.cgi?id=4405 where we considered replacing canFind() with any(). I think that contains() is exactly what we should have for the typical case of dealing with finding a specific element in an array or container, but we probably should have any() for the general case where you're looking to see whether the given predicate is true for _any_ element in the range. Adding all() to go along with it (as in it returns true if the given predicate is true for _all_ elements in the range) would be preferable. However, I definitely think that having contains() makes a _lot_ of sense, because that is exactly the function name that most people are looking for when they want to know whether a particular element is in a range. - Jonathan M Davis
