📜  Rust – 参考与借用(1)

📅  最后修改于: 2023-12-03 14:47:10.458000             🧑  作者: Mango

Rust - 引用和借用

Rust 是一个系统级编程语言,强调安全和并发。在 Rust 中,包含了引用和借用这个重要的概念,用来解决内存管理的问题。在本文中,我们将学习 Rust 中的引用和借用。

引用

在 Rust 中,引用是指向某个值的指针。与 C++ 相似,Rust 的引用也是具有生命周期的。引用的生命周期保证了引用在指向的值存在期间一直有效,可以避免出现悬空指针的情况。

引用的语法用 & 表示。例如:

fn main() {
    let x = 5;
    let xr = &x;
    
    println!("x is {}", x);
    println!("xr is {}", xr);
}

这里的 xrx 的引用,类型为 &i32。我们可以看到,输出结果为:

x is 5
xr is 5

这个例子中,引用 xr 指向了原始值 x,而不是将 x 的复制赋值给了 xr。这就避免了 x 和 xr 在内存中拥有不同的值。任何改变 x 的操作都会同时影响到 xr 中的值。

借用

借用是在 Rust 中很常见的一个操作。当我们需要在函数中使用某个值,但又不希望拥有对它的所有权时,我们就可以使用借用。这就避免了在传递值的同时进行内存拷贝的情况发生。

借用的语法与引用相同,同样使用 & 表示。例如:

fn add_one(x: &mut i32) {
    *x += 1;
}

fn main() {
    let mut x = 5;
    add_one(&mut x);
    
    println!("x is {}", x);
}

这里的 add_one 函数是一个接受 i32 的引用作为参数,将其加 1 并更新原始值的函数。在 main 函数中,我们使用 &mut x 把变量 x 的可变引用传递给函数 add_one。因为变量 x 被借用了,所以 main 函数仍然拥有所有权,并且可以接着使用它。

生命周期

在 Rust 中,所有引用都有它自己的生命周期。生命周期描述了引用的有效时间,保证了引用在指向的变量存活的时间内一直有效。生命周期的语法与引用的语法相似,同样使用 ' 符号表示。例如:

fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s1.len() > s2.len() {
        s1
    } else {
        s2
    }
}

fn main() {
    let s1 = String::from("hello");
    let s2 = String::from("world");

    let result = longest(s1.as_str(), s2.as_str());

    println!("The longest string is {}", result);
}

在这个例子中,我们定义了一个函数 longest,它接受两个字符串的引用作为参数,并返回较长的那个字符串的引用。这里使用了一个生命周期参数 'a,表示 s1s2 引用的生命周期是相同的。

总结

引用和借用是 Rust 中非常重要的概念,在代码中广泛使用。通过有效的生命周期管理,Rust 可以保证程序的安全和并发性,并且能够避免内存管理中的悬空指针和内存泄漏等问题。