1

主な目標は、タプル内にある所有ボックスにアクセスすることです。たとえば、(String, i32)以下のコードの文字列です。

私の最初の意図は、letバインディングを使用して所有ボックスから借りることでした。借用は非タプルの場合 (1) には機能しますが、タプルが関係する場合には機能しません (2)。

私の意図は間違っていますか?もしそうなら、文字列にアクセスする別の慣用的な方法はありますか?

コード例:

fn main() {
    // 1. Normal borrowing
    let s: String = "blub".to_string();
    let sr: &str = &s; // this works

    // 2. Borrowing from a tuple
    let st = ("blub".to_string(), 1);
    let (st_r, i): (&str, i32) = st; // error: mismatched types:

    println!( "{} {} {} {}", s, sr, st_r, i);
}

コンパイラ エラーは次のとおりです。

error: mismatched types:
 expected `(&str, i32)`,
    found `(collections::string::String, _)`
4

3 に答える 3

2

最も直接的な方法は、マッチングだと思います:

let st = (~"blub", 1i);
let (st_r, i) = match st {
    (ref s, i) => (s.as_slice(), i)
};
println!("{} {}", st_r, i);

orの代わりにref sandを使用したのには、2 つの理由があることに注意してください。まず、タイプの現在の特別なステータスのために許可されていません。DSTの変更が上陸したときに可能になるようです。2 番目に、そうしないと最初のタプル コンポーネントが に移動され、 bodyの内部から参照を返すことがまったくできなくなるため、使用しました。終了時に破棄されます。s.as_slice()s&*s&*s~strref ssmatchmatch

暗黙的にコピー可能でiあるため、そのような問題はありません。int

于 2014-04-18T17:33:45.563 に答える
0

タプルの 1 つの値だけを気にする場合は、数値アクセサー ( .0.1など) を使用することもできます。これらには参照演算子&を適用できます。

let st = ("blub".to_string(), 1);
let st_r = &st.0;
于 2016-03-17T13:37:48.293 に答える