Rust引用作用域疑问:为何书中标注不再使用后仍可复用?
为什么在Rust中重复使用引用没有报错?
首先明确Rust的核心规则:引用的作用域是从它被声明的位置开始,直到最后一次被使用的位置结束,而非变量存在的整个代码块。官方文档里的注释是针对示例的特定场景——在那个示例中,println!("{} and {}", r1, r2);之后确实没有再使用r1和r2,所以它们的作用域到这行就终止了。
看你的代码:
fn valid() { let s = String::from("hi"); let r1 = &s; // 合法的不可变引用 let r2 = &s; // 合法的不可变引用 println!("{}, {}", r1, r2); println!("{}", r1); // 这里再次使用了r1 }
你在第一次println之后又调用了println!("{}", r1);,这就把r1的作用域延长到了这一行。由于多个不可变引用本身就是Rust允许的操作,只要它们的作用域没有和可变引用冲突,编译器就不会报错。
这背后是Rust的非词法生命周期(NLL) 机制:编译器会精准跟踪每个引用的最后一次使用点,而非简单将作用域绑定到变量所在的整个代码块。这种设计让代码更灵活,避免了很多不必要的编译错误。
如果在你的代码最后添加一行可变引用,比如:
let r3 = &mut s; // 此处会触发编译错误
这时编译器就会报错,因为r1的作用域到最后一次使用它的println!("{}", r1);才结束,而可变引用与不可变引用不能同时存在。
内容的提问来源于stack exchange,提问作者Karan Kumar
相关产品推荐
相关产品推荐

