Rust 中的字符串借用和 println 问题
Issue with string borrowing and println in Rust
最近一直在学习rust,有什么想不通
为什么这样做有效
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
println!("{}", r);
let x = &mut s;
println!("{}", x);
}
但这不是
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
let x = &mut s;
println!("{}", r);
println!("{}", x);
}
它给出了以下错误:
cannot borrow `s` as mutable because it is also borrowed as immutable
如果 println 取得了字符串的所有权,但 return 没有取得它,为什么第一个片段有效。我们在这两种情况下做的不是一样的吗?
感谢您的建议。
总而言之,&mut s
是排他性借用,即它不允许在同一范围内进行任何其他类型的借用。
第一个代码片段由于 lexical scoping 而起作用,即,编译器足够聪明,可以确定 r
在 &mut s
.
之后没有被使用
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
println!("{}", r);
let x = &mut s;
println!("{}", x);
}
但是,如果我们使用这个片段而不是第一个片段。该代码将给出与再次使用 r
相同的错误 &mut s
,这在该语言中是不允许的。
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
println!("{}", r);
let x = &mut s;
println!("{}", x);
println!("{}", r);
}
最近一直在学习rust,有什么想不通
为什么这样做有效
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
println!("{}", r);
let x = &mut s;
println!("{}", x);
}
但这不是
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
let x = &mut s;
println!("{}", r);
println!("{}", x);
}
它给出了以下错误:
cannot borrow `s` as mutable because it is also borrowed as immutable
如果 println 取得了字符串的所有权,但 return 没有取得它,为什么第一个片段有效。我们在这两种情况下做的不是一样的吗?
感谢您的建议。
总而言之,&mut s
是排他性借用,即它不允许在同一范围内进行任何其他类型的借用。
第一个代码片段由于 lexical scoping 而起作用,即,编译器足够聪明,可以确定 r
在 &mut s
.
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
println!("{}", r);
let x = &mut s;
println!("{}", x);
}
但是,如果我们使用这个片段而不是第一个片段。该代码将给出与再次使用 r
相同的错误 &mut s
,这在该语言中是不允许的。
fn main() {
let mut s = String::from("hello");
println!("{}", &s);
let r = &s;
println!("{}", r);
let x = &mut s;
println!("{}", x);
println!("{}", r);
}