Can't use std.algorithm.remove on a char[]?
Jon D via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Apr 30 12:08:02 PDT 2016
On Saturday, 30 April 2016 at 18:32:32 UTC, ag0aep6g wrote:
> On 30.04.2016 18:44, TheGag96 wrote:
>> I was just writing some code trying to remove a value from a
>> character
>> array, but the compiler complained "No overload matches for
>> remove", and
>> if I specifically say use std.algorithm.remove() the compiler
>> doesn't
>> think it fits any definition. For reference, this would be all
>> I'm doing:
>>
>> char[] thing = ['a', 'b', 'c'];
>> thing = thing.remove(1);
>>
>> Is this a bug? std.algorithm claims remove() works on any
>> forward range...
>
> The documentation is wrong.
>
> 1) remove requires a bidirectional range. The constraints and
> parameter documentation correctly say so. char[] is a
> bidirectional range, though.
>
> 2) remove requires lvalue elements. char[] fails this, as the
> range primitives decode the chars on-the-fly to dchars.
>
> Pull request to fix the documentation:
> https://github.com/dlang/phobos/pull/4271
>
> By the way, I think requiring lvalues is too restrictive. It
> should work with assignable elements. Also, it has apparently
> been missed that const/immutable can make non-assignable
> lvalues.
>
There's a ticket open related to the lvalue element requirement:
https://issues.dlang.org/show_bug.cgi?id=8930
Personally, I think this example is more compelling than the one
in the ticket. It seems very reasonable to expect that
std.algorithm.remove will work regardless of whether the elements
are characters, integers, ubytes, etc.
If an initial step is to fix the documentation, it would be
helpful to include specifically that it doesn't work with
characters. It's not obvious that characters don't meet the
requirement.
--Jon
More information about the Digitalmars-d-learn
mailing list