我想使用一个范围作为函数参数,即调用类似:
foo(arr,1..23)
在函数中我想做类似的事情
int arr[22]
arr[21] = some_other_arr[<range>]
<range>
来自上面的1..23
调用。
那可能吗?我该如何申报foo
?
我想使用一个范围作为函数参数,即调用类似:
foo(arr,1..23)
在函数中我想做类似的事情
int arr[22]
arr[21] = some_other_arr[<range>]
<range>
来自上面的1..23
调用。
那可能吗?我该如何申报foo
?
首先,它不是一个范围——它只是只在语句1..23
内部起作用的特殊语法。foreach
与from相同的1..23
范围;它返回一系列连续值(例如整数)。iota(1, 23)
std.range
要将范围传递给函数,通常需要使用模板:
void foo(Range)(Range r)
{
foreach (e; r)
writeln(e);
}
然后你可以按照你想要的方式调用它:
foo(iota(1, 23)); // print the numbers from 1 to 23 (exclusive)
注意:如果arr
是一个数组,并且您想要索引处的值范围,1..23
那么您可以使用切片:
foo(arr[1..23]);
数组的切片是一个范围。
要让函数接受这一点,您不需要使用模板。foo
可以写成:
void foo(int[] r)
{
foreach (e; r)
writeln(e);
}
数组切片是最强大的范围 - 随机访问范围。那么为什么不简单地使用 slice 来满足您的需要:
import std.stdio;
import std.conv;
int main() {
int[] ina = [0, 1, 22, 11, 5, 9, 3];
auto arr = ina[2..5];
writeln(arr); // this is an example of a "function" with range as parameter
return 0;
}
/*** output:
[22, 11, 5]
****/
你可以在这里玩弄它:http: //dpaste.dzfl.pl/95568985(fork and run)。坦率地说,我会接受彼得的回答,因为它显示了你需要知道的一切。:)