在所有权的上下文中,需要对 Rust 中 Scope 和 Drop 调用的行为进行更多解释

Need more explanation in the behaviour of Scope and Drop call in Rust in the context of Ownership

提问人:Akash R 提问时间:8/31/2023 更新时间:8/31/2023 访问量:29

问:

我是 Rust 的新手,对了解它的所有权概念感到好奇。根据官方文件,提到了以下关于概念的内容:referencing

下面介绍了如何定义和使用 calculate_length 函数,该函数将对对象的引用作为参数,而不是获取值的所有权:

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

    let len = calculate_length(&s1);

    println!("The length of '{}' is {}.", s1, len);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}

&s1 语法允许我们创建一个引用 s1 值但不拥有它的引用。由于它不拥有它,因此当引用停止使用时,它指向的值不会被删除。

因此,在上面的场景中,仍然是可访问的,并且在函数结束之前不会超出范围,并且只有在函数结束之后才调用。但是,如果像这样将值传递给函数呢?s1maindropmaincalculate_length

let len = calculate_length(&String::from("hello"));

什么时候叫滴?这是谁?何时删除引用的 String 实例的值?我对此有点困惑,如果我能得到一个简单有效的解释,我将不胜感激。ownerString

所有权

评论

1赞 Chayim Friedman 8/31/2023
请注意,您应该使用 &str,而不是 &String
0赞 Akash R 8/31/2023
我实际上想知道它在幕后是如何工作的,因为他们在他们的文档中提到了以下内容: >因为它不拥有它,所以当引用停止使用时,它指向的值不会被删除。
0赞 Akash R 8/31/2023
@ChayimFriedman,我接受你的建议。但是我正在寻找一个令人信服的答案,如果在所有权、范围和删除函数调用的上下文中传入这些值会发生什么

答:

4赞 jthulhu 8/31/2023 #1

在其他编程语言(如 C)中,类似的东西将被禁止,因为不清楚该值是否具有要开始的地址。&String::from("hello")String::from("hello")

然而,在 Rust 中,临时词被丢弃在创建它们的语句的末尾(通常)。因此,就您而言,它将在分配给之后立即进行。len