"Cannot infer argument types" for foreach over byLine
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Jan 24 00:44:44 PST 2015
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
More information about the Digitalmars-d-learn
mailing list