On Saturday, 6 May 2017 at 10:15:03 UTC, k-five wrote:
On Saturday, 6 May 2017 at 08:53:12 UTC, Jonathan M Davis wrote:
On Saturday, May 6, 2017 8:34:11 AM CEST k-five via Digitalmars-d-learn wrote:
On Friday, 5 May 2017 at 17:07:25 UTC, Stanislav Blinov wrote:
> On Friday, 5 May 2017 at 09:54:03 UTC, k-five wrote:

---------------------------------------------------------

Although I am not sure but it may Range in D, has the same concept that C++ has on iterator, like InputIterator or OutputIterator, since I realized that the output of [ filter ] does not have RandomAccessRange so I can not use input[ 0 ]. But I can use input.front().

Also thank you @Stanislav Blinov, I am familiar with lambda but have never seen a lambda in shape of string :)

---------------------------------------------------------

Solving the problem by using
split and empty in std.string
or splitter in std.algorithm or splitter in std.regex

plus
filter in std.algorithm,
and accessing the elements by:
input.front()
input.popFront()

---------------------------------------------------------

for input:
import std.stdio : print = writeln;
import std.algorithm: filter;
import std.string: split, empty;

void main() {

        immutable (char)[] str = "one//two//three";
        
auto input = str.split( '/' ).filter!( element => !element.empty
 )();
        
        print( input.front );
        input.popFront();
        print( input.front );
        input.popFront();
        print( input.front );

}

the output is:
one
two
three

str.split('/') is eager, that is, it will iterate the input and return the array of delimited elements. So in fact you're getting an array of all elements (even empty ones), and then filtering it, ignoring empty elements. If you want to get the output as an array, it's better to use std.array as Jonathan mentioned:

import std.array : array;
auto inputArray = str.splitter('/').filter!(a => !a.empty)().array;

This will eagerly consume the results of filter and put them into an array.

Reply via email to