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.

You can use std.utf.byCodeUnit to get a char range over an char[], but using it here is a bit awkward, because there's no (documented) way to get the array back from a byCodeUnit range:
----
char[] thing = ['a', 'b', 'c'];
thing = thing[0 .. thing.byCodeUnit.remove(1).length];
----

You could also use ubyte[] instead of char[]:
----
ubyte[] thing = ['a', 'b', 'c'];
thing = thing.remove(1);
----

Reply via email to