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

D 如何使用范围作为函数参数?,d,D,我想使用一个范围作为函数参数,即调用如下内容: foo(arr,1..23) 在函数中,我想做如下操作 int arr[22] arr[21] = some_other_arr[<range>] int-arr[22] arr[21]=一些其他的arr[] 其中是上述调用中的1..23 可能吗?我如何声明foo?首先,1..23不是一个范围——它只是只在foreach语句中起作用的特殊语法 与1..23相同的范围是iota(1,23)fromstd.range;它返回一系列连续

我想使用一个范围作为函数参数,即调用如下内容:

foo(arr,1..23)
在函数中,我想做如下操作

int arr[22]
arr[21] = some_other_arr[<range>]
int-arr[22]
arr[21]=一些其他的arr[]
其中
是上述调用中的
1..23


可能吗?我如何声明
foo

首先,
1..23
不是一个范围——它只是只在
foreach
语句中起作用的特殊语法

1..23
相同的范围是
iota(1,23)
from
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);
}

首先,
1..23
不是一个范围——它只是只在
foreach
语句中起作用的特殊语法

1..23
相同的范围是
iota(1,23)
from
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]
****/
你可以在这里玩:(叉子和跑步)。
坦白地说,我会接受彼得的回答,因为它显示了你需要知道的一切

阵列片是最强大的范围-随机访问范围。那么,为什么不直接使用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]
****/
你可以在这里玩:(叉子和跑步)。
坦白地说,我会接受彼得的回答,因为它显示了你需要知道的一切

我选择使用范围访问
数组中的项。我将编辑该问题…不重新激活整个问题,我想指出您错过了模板约束。我认为,这是理解D如何工作的基础。例如,D定义了接口“InputRange”、“ForwardRange”等。据我所知,它们的问题在于:它们只处理继承(类)。为了支持非类范围,您需要模板约束(参数元组和大括号之间的“if子句”)。该约束自由指定实例化所需的最小模板参数属性(范围类型)。因此使用:
void func(R)(R range)if(isInputRange!R){}
I wnat来使用范围访问
数组中的项。我将编辑该问题…不重新激活整个问题,我想指出您错过了模板约束。我认为,这是理解D如何工作的基础。例如,D定义了接口“InputRange”、“ForwardRange”等。据我所知,它们的问题在于:它们只处理继承(类)。为了支持非类范围,您需要模板约束(参数元组和大括号之间的“if子句”)。该约束自由指定实例化所需的最小模板参数属性(范围类型)。所以使用:
void func(R)(R范围)如果(isInputRange!R){}
auto arr[22]=…
不是有效的D代码。@DejanLekic:err。。。我总是犯这个错误…你不能做
foo(arr,1..23)
但你可以做
foo(arr,iota(1,23))
或类似的…
auto-arr[22]=…
不是有效的D代码。@DejanLekic:err。。。我总是犯这样的错误…你不能做
foo(arr,1..23)
,但你可以做
foo(arr,iota(1,23))
或类似的事情…我想要的是把以
auto-arr
开头的行放入一个函数中,并将
2..5
作为函数参数传递。
myfun(2..5)
是不可能的,正如Peter已经解释的那样
myfun(一些数组[2..5])
是可能的。我想要的是将以
auto arr
开头的行放入一个函数中,并将
2..5
作为函数参数传递。
myfun(2..5)
是不可能的,正如Peter已经解释的那样
myfun(一些数组[2..5])
是可能的。