1

範囲を関数パラメーターとして使用したい、つまり次のように呼び出します。

foo(arr,1..23)

関数で次のようなことをしたい

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

どこ<range>1..23上記の呼び出しからです。

それは可能ですか?どのように宣言する必要がありfooますか?

4

2 に答える 2

5

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);
}
于 2013-01-10T16:20:55.840 に答える
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 (フォークして実行)。率直に言って、私はピーターの答えを受け入れます。:)

于 2013-01-11T09:00:39.803 に答える