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;
}
// 这段代码无法编译通过

总结

  • 在任意给定时间, 要么 只能有一个可变引用, 要么 只能有多个不可变引用
  • 引用必须总是有效的
如果对我分享的内容感兴趣的话  记得关注我得动态
求推荐  求收藏  求转发  求关注
posted @ 2021-06-21 19:58  Delayer  阅读(203)  评论(0编辑  收藏  举报