在Rust中,你能拥有一个字符串字面值吗?

13
根据Rust书的说法:

Rust中的每个值都有一个被称为所有者的变量。同一时间只能有一个所有者。当所有者超出范围时,该值将被丢弃。

根据rust-lang.org的说法:

静态项在程序结束时不会调用drop。

阅读完此SO帖子并查看以下代码后,我理解foo是一个值,其变量y(等同于&y因为字符串文字是字符串片段)被称为它的所有者。这正确吗?或者静态项没有所有者?
let x = String::from("foo");  // heap allocated, mutable, owned
let y = "foo" // statically allocated to rust executable, immutable

我在想,与拥有的String不同,字符串字面量没有被移动,这可能是因为它们存储在可执行文件的.rodata
fn main() {
  let s1 = "foo"; // as opposed to String::from("foo")
  let s2 = s1; // not moved
  let s3 = s2; // no error, unlike String::from("foo")
}

更新:根据Rust书籍

这些和号是引用符,它们允许您引用某个值而不需要拥有它...另一种没有所有权的数据类型是切片。

由于字符串字面量是字符串切片(&str)(见上面的引用),因此它们在逻辑上不具有所有权。理由似乎是编译器需要一个具有已知大小的数据结构:一个引用:

let s1: str = "foo"; // [rustc E0277] the size for values of type `str` cannot be known at compilation time [E]
1个回答

9
&str是字符串切片引用,它并不拥有指向的字符串切片,而是借用它。您可以对一个对象具有多个不可变引用,这就是为什么第二个代码示例是正确的,借用检查器高兴地接受它。
我认为可以说具有'static 生命周期的类型没有所有者,或者说在main函数之外的某个地方拥有它。只有当拥有对象的生命周期结束时(如果您拥有它,则需要释放资源),所有者才会起作用。对于引用,只有生命周期才重要。

6
可以补充一点:&str 本身就是一个类型。该类型实现了 Copy,这意味着它不会遵循移动语义,而是复制语义(@mellow-yellow,在书中你也会读到有关这个 trait 的内容)。你还可以说 y 确实是所有者,但不是实际字符串的所有者(因为它在 .rodata 部分),而是对它的引用。 y 是类型为 &str 的引用(指针)的所有者。希望这些补充有些意义。 - Lukas Kalbertodt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接