我有以下范围:
struct Range {
uint data;
@property{
bool empty() { return false; }
uint front() { return data; }
void popFront() { data = data * 2 + 1; }
}
}
Run Code Online (Sandbox Code Playgroud)
尝试使用它,
foreach(c; Rnage()){ /*...*/ }工作,但foreach(i, c; Range()){ /*...*/ }我得到:
Error: cannot infer argument types
Run Code Online (Sandbox Code Playgroud)
我需要i像这样的东西foreach(i, v; [1,2,3,4]){ }.
范围不支持语法
foreach(i, c; range)
Run Code Online (Sandbox Code Playgroud)
虽然看起来显然应该在简单的情况下工作,但该指数甚至应该取决于范围的类型,并不总是有意义的.因此,foreach不会自动提供索引的计数器,并且范围无法提供.
但是,由于元组使用foreach解压缩,您可以通过使用您的范围来实现:std.range.sequence std.range.zip
foreach (i, e; zip(sequence!"n"(), range))
{
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你不应该标注popFront有@property.它没有任何意义.popFront不接受任何参数并且不返回任何值.它根本不像一个变量.并且属性的关键是具有像变量一样的函数.如果/什么时候-property的实现完全整理出来并且它变成了正常的行为(此刻它有点错误,这是为什么它暂时是一个单独的开关的一部分),popFront就不会像你定义它那样可用.