Thread overview | ||||||
---|---|---|---|---|---|---|
|
January 24, 2015 "Cannot infer argument types" for foreach over byLine | ||||
---|---|---|---|---|
| ||||
import std.stdio; void main() { foreach (i, line; file.byLine()) { 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`. |
January 24, 2015 Re: "Cannot infer argument types" for foreach over byLine | ||||
---|---|---|---|---|
| ||||
Posted in reply to Meta | 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 |
January 24, 2015 Re: "Cannot infer argument types" for foreach over byLine | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Saturday, 24 January 2015 at 08:44:45 UTC, Ali Çehreli wrote:
> 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. ;)
Hmm, how have I not known that until now? I thought that feature worked for all ranges. Thanks.
|
January 26, 2015 Re: "Cannot infer argument types" for foreach over byLine | ||||
---|---|---|---|---|
| ||||
Posted in reply to Meta | On 1/24/15 11:15 AM, Meta wrote:
> On Saturday, 24 January 2015 at 08:44:45 UTC, Ali Çehreli wrote:
>> 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. ;)
>
> Hmm, how have I not known that until now? I thought that feature worked
> for all ranges. Thanks.
It would be confusing. Imagine this scenario:
auto l = file.byLine();
l.popFront();
foreach(i, line; l)
Now, the line numbers are off by one, because the ByLine struct does not track them.
-Steve
|
Copyright © 1999-2021 by the D Language Foundation