根据Rust书的说法:
我在想,与拥有的
根据rust-lang.org的说法:Rust中的每个值都有一个被称为所有者的变量。同一时间只能有一个所有者。当所有者超出范围时,该值将被丢弃。
阅读完此SO帖子并查看以下代码后,我理解静态项在程序结束时不会调用drop。
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]
&str
本身就是一个类型。该类型实现了Copy
,这意味着它不会遵循移动语义,而是复制语义(@mellow-yellow,在书中你也会读到有关这个 trait 的内容)。你还可以说y
确实是所有者,但不是实际字符串的所有者(因为它在.rodata
部分),而是对它的引用。y
是类型为&str
的引用(指针)的所有者。希望这些补充有些意义。 - Lukas Kalbertodt