如何使用范围作为函数参数?

时间:2013-01-10 14:31:18

标签: d

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

foo(arr,1..23)

在我希望做的事情中

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

上述电话中<range>1..23

这可能吗?我怎么必须声明foo

2 个答案:

答案 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)。 坦率地说,我会接受彼得的答案,因为它显示了你需要知道的一切。 :)