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)
fromstd.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)
fromstd.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])
是可能的。