Rust 入门 引用与借用
引用与借用
- 前一篇文章中讲到: 传递参数会发生所有权的转移
- 引用避免了所有权转移带来的问题
先看例子
fn main() {
let string = String::from("hello");
let length = len(&string);
println!("The length of '{}' is {}.", &string, length);
}
fn len(s: &String) -> usize {
s.len()
}
- 注意, 参数的类型是
&String
&
符号表示引用: 允许你引用某些值而不取得其所有权- 使用引用作为参数的行为就叫做借用
可变性
- 借用的值在一般情况下不能进行修改
- 如果需要修改借用来的值, 需要加上
mut
关键字
fn main() {
let mut string = String::from("Hello");
append(&mut string);
println!("{}", &string);
}
fn append(s: &mut String) {
s.push_str("World");
}
可变引用有一个限制: 在指定的作用域内, 对某一块数据只能存在一个可变的引用, 同时不能存在其他引用
- 通过创建新的作用域, 来创建多个可变引用
fn main() {
let mut string = String::from("Hello");
{
let s1 = &mut string;
}
let s2 = &mut string;
}
- 在 Rust 中, 不会发生悬垂引用
fn main() {
let str = test();
println!("{}", str);
}
fn test() -> &String {
// 创建一个局部变量
let s = String::from("hello");
// 返回局部变量的引用
return &s;
}
// 这段代码无法编译通过
总结
- 在任意给定时间, 要么 只能有一个可变引用, 要么 只能有多个不可变引用
- 引用必须总是有效的
如果对我分享的内容感兴趣的话 记得关注我得动态
求推荐 求收藏 求转发 求关注
求推荐 求收藏 求转发 求关注