string - 切片字符串会复制底层数据吗?

标签 string rust copy slice

在 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::takestd::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/

相关文章:

java - 如何在 Java 中比较字符串?

c++ - 字符串与特殊字符的匹配

javascript - 如何使用 Javascript 替换 HTML 页面中出现的所有字符串

rust - 为什么不能用if完成呢?

rust - 选择第一个 Some() 选项的惯用方式?

c++ - CUDA 将继承的类对象复制到设备

php - 用 PHP 检查 URL 是否有特定的字符串

rust - sqlx安装由于类型不匹配而失败

java - 在 Java 中复制字符串

iphone - 创建 NSObject 的副本