我想使用范围作为函数参数,即调用类似:
foo(arr,1..23)
在我希望做的事情中
int arr[22]
arr[21] = some_other_arr[<range>]
上述电话中<range>
为1..23
。
这可能吗?我怎么必须声明foo
?
答案 0 :(得分:5)
首先,1..23
不是范围 - 它只是特殊的语法,只能在foreach
语句中使用。
与1..23
相同的范围是来自iota(1, 23)
的{{1}};它返回一系列连续值(例如整数)。
要将范围传递给函数,通常需要使用模板:
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
答案 1 :(得分:1)
数组切片是最强大的范围 - 随机访问范围。那么为什么不简单地使用切片来满足您的需求:
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)。 坦率地说,我会接受彼得的答案,因为它显示了你需要知道的一切。 :)