可変引数が関数の引数として渡された場合、参照を保持せずに値を複製する場合でも、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つの行にする - 中括弧と定義変数に囲まれている...私は可能な場合は特に、借用チェッカーがサポートできる何かのように見えるときにこれを避けたいと思います。
私はこれが以前には回答されているが、重複は見つけられないと確信しています。あなたがそれを見つけたら私に知らせて、私はそれを閉じます。 – Shepmaster
うわー、私はちょうど非常に似た問題を偶然見つけました。 'vec.drain(vec.len() - 1 ..)'は許可されず、 'let vlen = vec.len(); vec.drain(vlen - 1 ..) 'はうまくコンパイルされます。回避策は簡単ではありませんが、実際には後者のようなものに簡単に想像することができるので、間違っていると感じます。根本的な原因は同じと思いますか? – user4815162342
@ user4815162342はい。 – Shepmaster