私は借りと可変の錆の概念にこだわっている:Rustでは、正確には変更可能で不変な借用は何ですか?
#[derive(Debug)]
struct Rectangle {
height: u32,
width: u32,
}
fn mut_area(rect_mut: &mut Rectangle) -> u32 {
rect_mut.width /= 2;
rect_mut.height * rect_mut.width
}
fn mut_string(s: &mut String) -> &str {
s.push_str("!");
let len = s.len();
&s[0..len/2]
}
fn main() {
let mut rect = Rectangle {
height: 50,
width: 40,
};
println!("original rect: {:?}", rect);
let a = mut_area(&mut rect);
println!("area of rect: {}", a);
println!("now rect: {:?}", rect);
let mut s = String::from("helloworld");
println!("original s: {}", s);
let half = mut_string(&mut s);
println!("half of the modified string: {}", half);
println!("modified s: {}", s);
}
私はそれをコンパイルしようとすると、コンパイラは私に言った:
error[E0502]: cannot borrow `s` as immutable because it is also borrowed as mutable
--> <anon>:32:32
|
30 | let half = mut_string(&mut s);
| - mutable borrow occurs here
31 | println!("half of the modified string: {}", half);
32 | println!("modified s: {}", s);
| ^immutable borrow occurs here
33 | }
| - mutable borrow ends here
私はルールがあります知っています約mutable reference:
あなたは特定のpiに対して1つの可変参照を持つことができます特定の範囲内のデータのエコー。
しかし、なぜrect
は借りることができますが、s
はできません。そして、ここで私が望むものを達成するには - 関数呼び出しの後に修正された文字列を出力するのですか?
どうもありがとう!返された '&str'は文字列の'&mut'ですか?そして、範囲外に出るときに解放される変数に '&mut'をある種の「排他ロック」として取ることができますか? – Melkor
正確ではありません。残りの文は正しいものの、関数によって返された参照は不変です。可変の借用は、借用されたオブジェクトに対する排他的なロックの一種です。 – ljedrz
私はこれらの異なるコンセプトに慣れなければならないだろうと思っていますが、今は基本的なアイデアが明確であることがわかります。 – Melkor