1

我想使用一个范围作为函数参数,即调用类似:

foo(arr,1..23)

在函数中我想做类似的事情

int arr[22]
arr[21] = some_other_arr[<range>]

<range>来自上面的1..23调用。

那可能吗?我该如何申报foo

4

2 回答 2

5

首先,它不是一个范围——它只是只在语句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);
}
于 2013-01-10T16:20:55.840 回答
1

数组切片是最强大的范围 - 随机访问范围。那么为什么不简单地使用 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)。坦率地说,我会接受彼得的回答,因为它显示了你需要知道的一切。:)

于 2013-01-11T09:00:39.803 回答