切片字符串是否会复制底层数据?

Hol*_*ins 2 string copy slice rust

在 Rust 中,如果我想要跨多个上下文进行只读访问&str而不复制实际的底层数据,我认为我只使用切片是否正确?

例子

let original_string = "here's a string";

let slice = &original_string[0..3];
Run Code Online (Sandbox Code Playgroud)

或者Rc<str>需要类似的东西吗?

Frx*_*rem 6

任何引用类型&Tor (包括像or 这样&mut T的切片类型)只会借用数据,并且在使用时不会隐式复制或移动数据。&str&[T]

Copy您可以通过使用 取消引用来显式从对实现的类型的引用进行复制,或者通过调用方法*从对实现的类型的引用进行显式复制。您还可以通过将可变引用替换为不同的值(例如使用或 )来显式移出可变引用。Cloneclonestd::mem::takestd::mem::replace

至少一个共享引用借用的任何数据都&T必须在该引用的生命周期内只读,但具有内部可变性的容器内的数据除外,例如Cell<T>RefCell<T>和。Mutex<T>AtomicU32

通常,使用引用的最大限制是它们的生命周期必须短于数据所有者的生命周期。在某些情况下,这可能会使代码很难或不可能纯粹用引用和生命周期来表达。引用计数指针如Rc<T>Arc<T>可以提供帮助,因为它们通常与共享引用类似&T,只不过不是从其他位置借用数据,而是将数据移动到Rc/中,然后在该/Arc的所有克隆之间共享数据所有权,消除了对引用生命周期的需求,但运行时成本很小。RcArc