Task to throw away string parts, use joiner and splitter not very successful

Dfr deflexor at yandex.ru
Tue Dec 31 23:36:10 PST 2013


This is interesting, why i can't just do it simpler way ?

"this.is.a.string"
              .splitter (".")
              .popBack
              .joiner (".")
              .array
              .writeln;


Because creating an extra function is not desired.

> As Chris wrote, using double quotes to use strings instead of 
> char solves the typing issse.
>
> I'd also suggest the following alternative, if you're going to 
> discard a lot of last elements in your code:
>     import std.stdio;
>     import std.algorithm;
>     import std.array;
>     import std.range;
>
>     /// Return seq without its last element.
>     auto poppedBack (T) (T seq) if (isInputRange!T) {
>         seq.popBack; // Discards the last element.
>         return seq;
>     }
>
>     void main () {
>         // Prints "this.is.a".
>         "this.is.a.string"
>             .splitter (".")
>             .poppedBack
>             .joiner (".")
>             .array
>             .writeln;
>     }
>
>
> On 12/31/2013 09:57 PM, Chris Cain wrote:
>> On Tuesday, 31 December 2013 at 20:49:55 UTC, Dfr wrote:
>>> Hello, i have string like "this.is.a.string" and want to 
>>> throw away
>>> some parts separated by dots, here is first attempt:
>>>
>>> name = "this.is.a.string"; // <-- want to make "this.is.a" 
>>> from this
>>> auto nameparts = splitter(name, '.');
>>> auto name1 = joiner(nameparts[0 .. $-1], '.');
>>>
>>> And got this error: "Error: Result cannot be sliced with []"
>>>
>>> So, kinda fixed it (correct way?):
>>>
>>> name = "this.is.a.string";
>>> auto nameparts = splitter(name, '.').array;
>>> auto name1 = joiner(nameparts[0 .. $-1], '.');
>>>
>>> got this:
>>>
>>> Error: template std.algorithm.joiner does not match any 
>>> function
>>> template declaration. Candidates are:
>>> /usr/include/dmd/phobos/std/algorithm.d(2846):
>>> std.algorithm.joiner(RoR, Separator)(RoR r, Separator sep) if
>>> (isInputRange!RoR && isInputRange!(ElementType!RoR) &&
>>> isForwardRange!Separator && is(ElementType!Separator :
>>> ElementType!(ElementType!RoR)))
>>>
>>> Stuck here, thank you for any help.
>>
>> From your error message: isForwardRange!Separator
>>
>> Your separator is a character, which isn't a forward range. 
>> Try this:
>> `auto name1 = joiner(nameparts[0 .. $-1], ".");`


More information about the Digitalmars-d-learn mailing list