在 Rust 中,如果我想只读访问一个 &str
在不复制实际底层数据的情况下跨多个上下文,我认为我只使用一个切片是正确的吗?
示例
let original_string = "here's a string";
let slice = &original_string[0..3];
或者类似 Rc<str>
的东西需要吗?
最佳答案
任何引用类型 &T
或 &mut T
(包括 &str
或 &[T]
等切片类型)只会借用数据,使用时不会隐式复制或移动数据。
您可以显式地从引用复制到实现 Copy
的类型通过使用 *
取消引用它,或来自对实现 Clone
的类型的引用通过调用 clone
方法。您还可以通过将其替换为不同的值来显式移出可变引用,例如 std::mem::take
或 std::mem::replace
.
至少被一个共享引用借用的任何数据 &T
在该引用的生命周期内必须只读,具有内部可变性的容器内的数据除外,例如 Cell<T>
, RefCell<T>
, Mutex<T>
和 AtomicU32
.
通常,使用引用的最大限制是它们的生命周期必须短于数据所有者的生命周期。在某些情况下,这可能会使代码难以或不可能纯粹用引用和生命周期来表达。引用计数指针,如 Rc<T>
和 Arc<T>
可以提供帮助,因为它们通常类似于共享引用 &T
, 除了不是从其他位置借用数据,而是将数据移动到 Rc
中。/Arc
然后数据所有权在 Rc
的所有克隆之间共享/Arc
,消除了对引用生命周期的需求,但运行时成本很小。
关于string - 切片字符串会复制底层数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70468539/