5

編集者注: このコード例は、Rust 1.0 より前のバージョンのものであり、構文的に有効な Rust 1.0 コードではありません。このコードの更新されたバージョンではさまざまなエラーが発生しますが、回答には依然として貴重な情報が含まれています。

Rust 0.6でこのコードを試しました:

fn test<'r>(xs: &'r [&str]) -> &'r str {
    return xs[0];
}

この型シグネチャの意味は次のとおりだと思います。

refs.rs:2:8: 2:12 error: mismatched types: expected `&'r str` but found `&str` (lifetime mismatch)
refs.rs:2       return xs[0];
                       ^~~~
refs.rs:1:39: 3:1 note: the lifetime &'r  as defined on the block at 1:39...
refs.rs:1 fn test<'r>(xs: &'r [&str]) -> &'r str {
refs.rs:2       return xs[0];
refs.rs:3 }
refs.rs:1:39: 3:1 note: ...does not necessarily outlive the anonymous lifetime #1 defined on the block at 1:39
refs.rs:1 fn test<'r>(xs: &'r [&str]) -> &'r str {
refs.rs:2       return xs[0];
refs.rs:3 }
error: aborting due to previous error

これは、ベクトル内のポインターが (読み取り専用) ベクトル自体ほど長く存続しない可能性があることを暗示しているようです。これは可能ですか?

これが問題ないことをコンパイラに伝えるために、追加の注釈を付ける必要がありますか?

同様に、所有されたポインターのベクトルはどうでしょうか? 例えば

fn test<'r>(xs: &'r [~str]) -> &'r str {
    return xs[0];
}

繰り返しますが、少なくともリスト全体を借用している限り、ベクトルの要素へのポインタを借用できると期待しています。

コンテキストとして、私の最初の問題は、借用したポイントのリストを所有するポインターのリストで拡張しようとすることでした:

fn extend<'r>(xs: ~[&'r str], ys: &'r [~str]) -> ~[&'r str]

計画は次のとおりでした: 借用したすべてのポインターを含む拡張リストを作成し、それを使用してから、拡張リストを解放し、含まれている文字列を含む所有ポインターの元のリストを解放します。

4

4 に答える 4

0

これがあなたの言いたいことだと思います:

fn get1<'r, T>(xs: &'r [T]) -> &'r T {
    return &xs[0];
}

fn main() {
    let a = ~[1, 2, 3];
    let b = [1, 2, 3];
    let c = @[1, 2, 3];
    let ax = get1(a);
    let bx = get1(b);
    let cx = get1(c);
    println(fmt!("%d %d %d", *ax, *bx, *cx));
}

特に文字列の場合、(文字列は常に参照渡しであるため) あまり良くないかもしれませんが、値のベクトルでは問題なく動作します。

于 2013-05-20T10:33:01.337 に答える