< 返回版块

5000_years_ago 发表于 2022-05-27 15:47

Tags:所有权

例子如下,求大佬告诉下,这个创建出来的String的实例的所有权归谁所有的

{
    let a = &String::from("a");
    let b = a;
}

我又修改了一下,问题焦点主要集中在所有权归属上

评论区

写评论
作者 5000_years_ago 2022-05-27 21:29

谢谢几位的回复,就不一一回复了,原来rust还有匿名变量引用这么一种现象啊

苦瓜小仔 2022-05-27 19:49
{
    let a = &String::from("a");
    let b = a;
}
// 等价于
{
    let s = String::from("a");
    let a = &s;
    let b = a;
} // drop(s)

&String::from("a"); 实质上隐式创建了作用域内的临时变量,临时变量拥有 String::from("a"),所有的引用也只在该作用域内有效,作用域结束时,临时变量被释放。

这其实非常直观,而且无处不在,考虑以下代码:

fn h() {
    let s = "abc";
    s.replace("a", "d").replace("c", "e");
}

// 其中 replace 返回 String:
pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String
    where P: Pattern<'a> { ... }

其 MIR:

fn h() -> () {
    let mut _0: ();                      // return place in scope 0 at /app/example.rs:10:8: 10:8
    let _1: &str;                        // in scope 0 at /app/example.rs:11:9: 11:10
    let _2: std::string::String;         // in scope 0 at /app/example.rs:12:5: 12:42
    let mut _3: &str;                    // in scope 0 at /app/example.rs:12:5: 12:42
    let _4: &str;                        // in scope 0 at /app/example.rs:12:5: 12:42
    let mut _5: &std::string::String;    // in scope 0 at /app/example.rs:12:5: 12:42
    let _6: std::string::String;         // in scope 0 at /app/example.rs:12:5: 12:24
    let mut _7: &str;                    // in scope 0 at /app/example.rs:12:5: 12:24
    let mut _8: &str;                    // in scope 0 at /app/example.rs:12:20: 12:23
    let _9: &str;                        // in scope 0 at /app/example.rs:12:20: 12:23
    let mut _10: &str;                   // in scope 0 at /app/example.rs:12:38: 12:41
    let _11: &str;                       // in scope 0 at /app/example.rs:12:38: 12:41
    ...
}

可以看到,方法返回的值也是被赋给隐式创建的临时变量。

godbolt

viruscamp 2022-05-27 19:37

你的代码相当于

{
  let tmp = String::from("a");
  let a = &tmp;
  let b = a;
}

换成你写的代码,tmp 就是一个匿名临时栈上变量,拥有 String 的所有权,它因为临时变量生存期延长而活的比 a, b 都长。

ywxt 2022-05-27 18:47

會的。

可以理解爲String的所有權屬於一箇匿名變量,出作用域後就會drop。

作者 5000_years_ago 2022-05-27 17:57

主要想知道所有权是谁拥有的,按教程上说的String应该是分配在堆上的,超出作用域应该会回收,这个好理解,但&String::new()创建出来的,变量接收的是一个引用,不知道所有权给了谁

--
👇
BalterNotz: 应该会的,不确定。

BalterNotz 2022-05-27 17:22

应该会的,不确定。

1 共 6 条评论, 1 页