4

この質問はRust 1.0より前の構文を使用していますが、概念は普遍的であり、安定したRust 1.0を反映するために多くの回答が更新されています.

この質問は、プログラマーが Rust を学習する際に試みる可能性のある非常に基本的なことに関するものです。

Rust 言語についてもっと簡単な質問をすることはできないと思いますが、私は 30 年の経験を持つプログラマーなので、理解できません。

int::range私はそれが閉鎖と関係があると思います。

これは私が Rust の非常に初期のバージョン (1.0 より前) で書いたものです。

fn main() {
    int::range(0, 100, {|i| 
        io::println(i);
    });
}

これにより、修正方法がわからない素敵なエラーメッセージが作成されます。

hello.rs:3:19: 5:2 error: mismatched types: expected `&fn(int) -> bool` but found `()` (expected fn but found ())
hello.rs:3 int::range(0, 100, {|i| 
hello.rs:4     io::println(i);
hello.rs:5 });

関数本体全体が出力されたのはおかしいですが、それでもそれが何を&fn(int) ->b ool意味するのかわかりません。Rust では、イテレータのクロージャの本体で戻り値の型を宣言しないことは明示的に許可されていないのではないかと漠然と考えており、混乱しています。

4

2 に答える 2

11

さびは確かに長い道のりを歩んできました!Rust 1.0 では、範囲にはいくつかの構文 sugarがあり、トレイトstart..endを実装します。Iterator組み合わせると、次のように言えます。

fn main() {
    for i in 0..100 {
        println!("{}", i);
    }
}

Rust 1.26以降では、包括的な範囲も使用できます。

fn main() {
    for i in 0..=99 {
        println!("{}", i);
    }
}

以下も参照してください。

于 2015-05-23T14:57:16.753 に答える
9

この回答が投稿されてから、Rust 1.0 はかなり変更されました。今日、このように反復する正しい方法は次のようになります。

fn main() {
    for i in 0..99 {
        println!("{}", i);
    }
}

元の答え:

int::rangeを受け取り、を受け取り、を返す&fn(int) -> bool関数を意味します。あなたの関数は を返しません。intboolbool

これに対処する一般的な方法は、for構文構造を使用することです。これにより、関数が を返すものから を返すものに変換さ()bool、 と をサポートできるようにbreakなりloopます。

for int::range(0, 100) |i| {
    io::println(fmt!("%d", i));
}

(少なくとも Rust 0.6 では、関数の適切な構文は の|i|前にを配置することにも注意してください{)


高階反復関数が Rust で機能する方法は、bool戻り値を使用して反復を継続するかどうかを決定することです。の戻り値はtrue反復を続けることを意味し、 の戻り値はfalse反復を停止することを意味します。コンストラクトは、変換する関数を適切な return ステートメントにfor書き換えます。とに変換されます。また、ステートメントをループの外側からの一時的なフラグ変数への変更 (その後に) に変換し、反復関数が完了した後に参照して、外側の関数から戻る必要があるかどうかを判断します。breakloopbreakreturn falseloopreturn truereturnreturn false

于 2013-04-27T18:42:44.310 に答える