On 01/24/2015 12:14 AM, Meta wrote:

> import std.stdio;
>
> void main()
> {
>      foreach (i, line; file.byLine())

Unless the range itself provides explicitly, automatic counter is available only for arrays. Otherwise, you have to enumerate yourself. ;)

import std.stdio;
import std.range;

void main()
{
    foreach (i, element; iota(42, 45).enumerate) {
        writefln("%s: %s", i, element);
    }
}

I am not sure whether std.range.enumerate is available in the current compiler. If not, you can use zip and sequence:

    foreach (i, element; zip(sequence!"n", iota(42, 45))) {
        writefln("%s: %s", i, element);
    }

However, that code is taking advantage of automatic tuple expansion, which causes trouble in some cases but not here. If you don't want that, you can expand the tuple explicitly:

    foreach (t; zip(sequence!"n", iota(42, 45))) {
        writefln("%s: %s", t[0], t[1]);
    }

>      {
>          writeln(line);
>      }
> }
>
> This code gives me the error:
>
> Error: cannot infer argument types, expected 1 argument, not 2
>
> This is a very obtuse compiler message considering how simple the code
> is; I know it's got something to do with the foreach statement and what
> byLine() returns, but I can't seem to get it to compile without removing
> `i`.

Ali

Reply via email to