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