如何查看和推进 foreach 循环内的范围
How does one peek and advnace a range inside a foreach loop
在遍历范围的 foreach 循环中,我想 (1) 前进和 (2) 在不前进的情况下查看范围中的下一个元素。
import std.range: splitter;
import std.conv: parse;
foreach(numstr; line.splitter(',')) {
const int code = parse!int(numstr);
switch (code) {
case 1:
auto next1 = // currentRange.next()
// calling next() advances the range
auto next2 = // currentRange.next()
auto next3 = // currentRange.next()
// ...
case 2:
auto next1 = // currentRange.peek()
// calling peek() will not forward the range
currentRange.advanceBy(4);
// ...
// ...
}
}
(1) advance
您可以使用 popFront
手动增加范围,但我不建议将其与 foreach
循环结合使用。也许将 foreach
替换为 while (!range.empty)
?
(2) peek over the next element in the range without advancing it
为此,提前复制一份:
range.save.dropOne.front
range.save.drop(4).front
当然,拆分器必须为每个 peek 重做工作。为避免这种情况,将其结果保存到数组中,或使用 split
.
在遍历范围的 foreach 循环中,我想 (1) 前进和 (2) 在不前进的情况下查看范围中的下一个元素。
import std.range: splitter;
import std.conv: parse;
foreach(numstr; line.splitter(',')) {
const int code = parse!int(numstr);
switch (code) {
case 1:
auto next1 = // currentRange.next()
// calling next() advances the range
auto next2 = // currentRange.next()
auto next3 = // currentRange.next()
// ...
case 2:
auto next1 = // currentRange.peek()
// calling peek() will not forward the range
currentRange.advanceBy(4);
// ...
// ...
}
}
(1) advance
您可以使用 popFront
手动增加范围,但我不建议将其与 foreach
循环结合使用。也许将 foreach
替换为 while (!range.empty)
?
(2) peek over the next element in the range without advancing it
为此,提前复制一份:
range.save.dropOne.front
range.save.drop(4).front
当然,拆分器必须为每个 peek 重做工作。为避免这种情况,将其结果保存到数组中,或使用 split
.