2017-01-02 4 views
1

可変引数が関数の引数として渡された場合、参照を保持せずに値を複製する場合でも、borrowチェッカーはこれを他の引数を構成するために使用できません。Rustのチェッカーと関数の引数を借用してください。

関数の外に変数を割り当てることは常にオプションですが、論理的にはこれは熱心で、貸借チェッカーが考慮できるものです。

これは意図したとおりに動作するのでしょうか、解決すべきことはありますか?

#[derive(Debug)] 
struct SomeTest { 
    pub some_value: f64, 
    pub some_other: i64, 
} 

fn some_fn(var: &mut SomeTest, other: i64) { 
    println!("{:?}, {}", var, other); 
} 

fn main() { 
    let mut v = SomeTest { some_value: 1.0, some_other: 2 }; 
    some_fn(&mut v, v.some_other + 1); 

    // However this works! 
/* 
    { 
     let x = v.some_other + 1; 
     some_fn(&mut v, x); 
    } 
*/ 
} 

は、このエラーを与える:

--> src/main.rs:14:21 
    | 
14 |  some_fn(&mut v, v.some_other + 1); 
    |     - ^^^^^^^^^^^^ use of borrowed `v` 
    |     | 
    |     borrow of `v` occurs here 

は参照してください:playpen


[1]:ワンオフ割り当てが時々読みやすさを向上させるんが、引数のためにそれらを使用することを余儀なくされている他の場合の関数呼び出しを引き起こして、名前空間を汚染し、単一の使用変数を避けるために、スコープの使用を奨励1つの行にする - 中括弧と定義変数に囲まれている...私は可能な場合は特に、借用チェッカーがサポートできる何かのように見えるときにこれを避けたいと思います。

答えて

3

これは、借用チェッカーの現在の実装の成果物です。これはよく知られている制限で、、少なくとも 2013となり、誰もそれに喜ばれません。

Is this working as intended

はい。

something that should be resolved?

はい。

魔法のキーワードは「語彙外の生涯」です。現在、生存期間はレキシカルです。つまり、入力したソースブロックに対応しています。理想的には、foo.method(foo.mutable_method())は、借り入れが「カッコの内側」で終了することを認識しますが、無数の理由から、それは文全体に結びついています。

詳細については、RFC issue 811とそこからリンクされているすべてを参照してください。

+1

私はこれが以前には回答されているが、重複は見つけられないと確信しています。あなたがそれを見つけたら私に知らせて、私はそれを閉じます。 – Shepmaster

+0

うわー、私はちょうど非常に似た問題を偶然見つけました。 'vec.drain(vec.len() - 1 ..)'は許可されず、 'let vlen = vec.len(); vec.drain(vlen - 1 ..) 'はうまくコンパイルされます。回避策は簡単ではありませんが、実際には後者のようなものに簡単に想像することができるので、間違っていると感じます。根本的な原因は同じと思いますか? – user4815162342

+1

@ user4815162342はい。 – Shepmaster

関連する問題