範囲を関数パラメーターとして使用したい、つまり次のように呼び出します。
foo(arr,1..23)
関数で次のようなことをしたい
int arr[22]
arr[21] = some_other_arr[<range>]
どこ<range>
に1..23
上記の呼び出しからです。
それは可能ですか?どのように宣言する必要がありfoo
ますか?
範囲を関数パラメーターとして使用したい、つまり次のように呼び出します。
foo(arr,1..23)
関数で次のようなことをしたい
int arr[22]
arr[21] = some_other_arr[<range>]
どこ<range>
に1..23
上記の呼び出しからです。
それは可能ですか?どのように宣言する必要がありfoo
ますか?
First, 1..23
isn't a range -- it's just special syntax that works only inside foreach
statements.
A range that does the same as 1..23
is iota(1, 23)
from std.range
; it returns a range of successive values (such as integers).
To pass a range into a function, you generally want to use templates:
void foo(Range)(Range r)
{
foreach (e; r)
writeln(e);
}
Which you can then call the way you want:
foo(iota(1, 23)); // print the numbers from 1 to 23 (exclusive)
Note: if arr
is an array, and you want a range of the values at indices 1..23
then you can use a slice:
foo(arr[1..23]);
A slice of an array is a range.
To have a function accept this, you don't need to use templates. foo
could be written:
void foo(int[] r)
{
foreach (e; r)
writeln(e);
}
配列スライスは、最も強力な範囲、つまりランダム アクセス範囲です。では、必要なものにスライスを単純に使用しないのはなぜですか。
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 (フォークして実行)。率直に言って、私はピーターの答えを受け入れます。:)