将字符串转换为 &strs 时,切片和显式重新借用之间有区别吗?

2023-11-24

下面两个例子等价吗?

示例1:

let x = String::new();
let y = &x[..];

示例2:

let x = String::new();
let y = &*x;

一种比另一种更有效率还是它们基本相同?


如果是String and Vec,他们做同样的事情。在general但是,它们并不完全等同。

首先你要明白Deref。当类型在逻辑上“包装”一些较低级别、更简单的值时,会实现此特征。例如,所有“智能指针”类型(Box, Rc, Arc) 实施Deref让您访问其内容。

它也被实施用于String and Vec: String“derefs”更简单str, Vec<T>取消引用更简单的[T].

Writing *s只是手动调用Deref::deref转动s进入其“更简单的形式”。几乎总是这样写&*s,但是:虽然Deref::deref签名表示它返回一个借用的指针(&Target),编译器插入第二个自动解引用。这是为了,例如,{ let x = Box::new(42i32); *x }结果是i32而不是一个&i32.

So &*s实际上只是简写Deref::deref(&s).

s[..]是语法糖s.index(RangeFull),由Index特征。这意味着对被索引的事物的“整个范围”进行切片;对彼此而言String and Vec,这将为您提供整个内容的一部分。再次,结果是技术上一个借用的指针,但 Rust 自动取消引用这个指针as well,所以它也几乎总是写成&s[..].

那么有什么区别呢?保持这个想法;让我们来谈谈Deref链接。

举个具体的例子,因为你可以查看String as a str, 这将是really有助于获得所有可用的方法strs 自动可用String也是如此。 Rust 不是继承,而是通过Deref链接。

它的工作方式是,当您请求某个值的特定方法时,Rust 首先查看为该特定类型定义的方法。假设它没有找到您要求的方法;在放弃之前,Rust 会检查Deref执行。如果它找到一个,它会调用它,然后再试一次.

这意味着当你打电话时s.chars() where s is a String, 什么是actually正在发生的是你正在打电话s.deref().chars(), 因为Stringhave一个方法叫做chars, but str does(向上滚动可以看到String只得到这个方法,因为它实现了Deref<Target=str>).

回到最初的问题,两者的区别&*s and &s[..]是在发生什么时s is not just String or Vec<T>。让我们举几个例子:

  • s: String; &*s: &str, &s[..]: &str.
  • s: &String: &*s: &String, &s[..]: &str.
  • s: Box<String>: &*s: &String, &s[..]: &str.
  • s: Box<Rc<&String>>: &*s: &Rc<&String>, &s[..]: &str.

&*s only ever剥落one间接层。&s[..]剥落他们全部。这是因为没有一个Box, Rc, &, etc.实施Index特质,所以Deref链接导致调用s.index(RangeFull)链接所有这些中间层。

您应该使用哪一个?无论你想要哪个。使用&*s (or &**s, or &***s)如果你想控制exactly您想要剥离多少间接层。使用&s[..]如果您想将它们全部剥离并仅获取该值的最内部表示形式。

或者,你可以做我所做的并使用&*s因为它是从左到右读取的,而&s[..]再次从左到右到左阅读,这让我很恼火。 :)

Addendum

  • 有一个相关的概念Deref强制.
  • 还有DerefMut and IndexMut执行上述所有操作,但是对于&mut代替&.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串转换为 &strs 时,切片和显式重新借用之间有区别吗? 的相关文章

  • 我的 Bitset 的大小是多少?

    我想存储System currentTimeInMillis以尽可能小的空间存储在内存中 因为我必须将数百万个它们存储在内存中 我把它转换为binaryString这给了我41 bits 这是我的程序 public class BitSet
  • 以编程方式获取 Android 设备的所有 RAM 内存,而不仅仅是分配给用户进程的内存

    我有一台设备 我确信它的 RAM 内存为 512 MB 希望能够以编程方式检索该值 512 MB 到目前为止 我在互联网上遇到的主要是这两种方式 https stackoverflow com a 16143065 1521264 http
  • Rust 元组参考和参考元组

    元组引用和作为类型引用的元组之间有什么关系 为什么第一个有效但第二个不行 let a 1 let b 2 This works c i32 d i32 let c d a b type TupleOfRef lt a gt a i32 a
  • Python列表内存存储[重复]

    这个问题在这里已经有答案了 据我了解 Python 列表本质上是 C 数组 它们分配特定的顺序内存块 但是 这些内存块实际上存储列表中的数据还是它们只是指向内存中存储实际数据的另一个位置 它可能取决于列表中存储的对象的大小吗 因为您可以轻松
  • 如何为 Rust 测试中的所有测试函数创建一个具有作用域/生命周期的变量?

    我有一个在深入测试细节之前初始化变量的测试 我想使用相同的变量进行第二次测试 而不是重复初始化代码 test fn test one let root Path new data the rest of the test test fn t
  • ANSI-C:打印十进制整数的最大字符数

    我想知道这是否是确定打印小数的最大字符数的简单方法int I know
  • std::deque 的内存开销到底是怎么回事?

    我正在研究一种使用外部排序算法std queue并且必须仔细限制其内存使用 我注意到在合并阶段 使用了几个std queues 固定长度 我的内存使用量增加到我预期的大约 2 5 倍 自从std queue默认情况下使用std deque作
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 用于解析 Rust 中的匹配臂的递归宏

    我正在尝试编写一个宏来将一组规则扩展为执行标记匹配的代码 但无法在不导致宏扩展错误的情况下生成正确的代码 我知道我可以通过其他方式处理这个问题 但这里的关键问题不是如何解析令牌 而是如何编写一个可以使用匹配臂递归扩展令牌树的宏 这个想法是我
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 如何在iOS中查找文本段范围

    如何在 iOS 中找到文本段 又名代码段 范围 意思是 文本段的起始地址和结束地址是多少 I found 这个有趣的帖子 http www pschweitzer fr p 12但它适用于 Android 但不适用于 iOS 经过一些挖掘和
  • jq:错误:无法添加数字和字符串

    我想从下面的 jq 输出中打印 Members 和 id 的值 cat test jq r select name AAA name AAA members 10 profiles 0 templates 0 ldapGroups 0 ld
  • Rust 柴油有条件过滤查询

    我正在尝试在一个项目中使用柴油 并且我想要一个 可过滤 类型 这个想法是你可以去 api foo id 10 bar 11它会返回一个结构体Foo struct Foo id Option
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • ruby中如何将binary32转换为float

    我有一个以 IEEE 32 编码的 binary32 如何将 0x0040EDC2 转换为 118 625 我尝试了几种打包和解包选项 但没有成功 IEEE http en wikipedia org wiki Single precisi
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • 如何实现 Vec 的修剪?

    Rust 提供了字符串的修剪方法 str trim http doc rust lang org stable std primitive str html method trim删除前导和尾随空格 我想要一个对字节串执行相同操作的方法 应

随机推荐

  • JavaScript 写入文本文件

    我正在尝试从表单中获取输入并将其保存到与 html 文件位于同一文件夹中的文本文件中 这是我到目前为止所拥有的
  • Spring 3:如何从 TaskExecutor 调用 @Async 注解的方法

    我是 Spring 异步任务执行的新手 所以如果这听起来像一个愚蠢的问题 请原谅我 我读到 Async 注释是从 Spring 3 x 开始在方法级别引入的 该方法的调用将异步发生 我还读到我们可以在 spring 配置文件中配置 Thre
  • 如何使用 Perl 轻松批量重命名文件?

    我有很多文件正在尝试重命名 我尝试创建一个正则表达式来匹配它们 但即使如此 我仍然卡在文件的命名上 如下所示 文件名01 文件名 100 文件名02 文件名03 等等 我想在任何小于 100 的文件后面添加一个 0 零 如下所示 文件名00
  • JavaFX - 等待任务完成

    我有一个 JavaFX 应用程序 它实例化了几个Task对象 目前 我的实现 见下文 调用行为运行工厂 它在任务对象下执行计算 与此平行的是 下一个函数 被调用 有没有办法拥有下一个函数 等待 直到先前的任务完成 我明白线程 join 等待
  • 树莓派自动登录无需etc/inittab

    我想将我的 Raspberry Pi 设置为以特定用户自动登录 我用谷歌搜索了这个 我找到的解决方案是关于编辑 etc inittab 文件 我的问题是现在我没有该文件 它在我的 Raspbian 版本中似乎丢失了 还有其他方法可以做到这一
  • 相当于 X11 中的“无效矩形”/“WM_PAINT”

    我正在将一些代码从 Windows 移植到 XLib 在Windows代码中 我可以通过调用强制重绘InvalidateRect然后处理相应的WM PAINT信息 但是 我无法找到如何在 X11 XLib 中执行此操作 我看到有一个Expo
  • 使用 javascript 将内容添加到表格行 ()?

    我有一个表如下 table tr td col 1 td td col2 td tr tr td field td td Field 2 td tr tr td another field td td one more field td t
  • MySQL 从一张表更新到另一张表时条件不起作用?

    我尝试过一种似乎对其他人有效的解决方案 从表 b 更新表 a 其中 条件 我似乎无法让它工作 MySql 给了我一个语法错误 我有两个表 我需要将一个表中的一列更新为另一列的值 其中两个表中的 id 都匹配 UPDATE video dat
  • 找不到控制器方法 - laravel 4

    我在尝试运行任何控制器时收到此消息 Symfony Component HttpKernel Exception NotFoundHttpException 未找到控制器方法 我的路线文件中有此代码 Route controller Hom
  • 重新分配而不释放旧内存

    我想使用 realloc 来增加内存大小 同时保持指针不变 因为调用者使用它 realloc 并不总是这样做 有时它会返回一个不同的指针并释放旧的指针 我想 尝试 重新分配内存 如果不可能 则使用原始指针回退到不同的方法 但重新分配已经破坏
  • CodeIgniter + jQuery(ajax) + HTML5 Pushstate:如何使用真实的 URL 进行干净的导航?

    我目前正在尝试建立一个新网站 没什么特别的 漂亮又小 但我一开始就陷入困境 我的问题是干净的 URL 和页面导航 我想以 正确的方式 去做 我想要什么 我使用 CodeIgniter 来获取干净的 URL 例如 www example co
  • 在ios中重绘视图

    是否可以重绘整个视图 我需要它来完成我的语言设置 问题是语言只有在再次绘制视图后才会改变 就像您退出设置然后再次进入一样 语言也会更改 但是当你保存所有内容时 语言保持不变 那么 在发现语言更改后 我应该如何重新绘制我的视图 或者最好是整个
  • 滑动屏幕的某些部分

    I am trying to design one screen which contain some swipe part I have one screen with mapview listview and some text My
  • 使用 axios 获取本地 JSON 数据时遇到问题

    我正在尝试使用 axios 从本地 json 文件获取数据 在控制台下我什至无法得到回应 所以我想我应该在这里询问一下 js 文件 var loadData function loadData axios url filepath json
  • ASP.Net MVC 模型绑定 - 如何更改日期格式?

    我有这个应用程序 默认日期格式必须是dd MM yyyy 语言为巴西葡萄牙语 我已经将文化和 UI 文化设置为pt BR现在myDate ToShortDateString 返回我想要的日期 我可以毫无困难地展示它们 问题是 当用户在输入字
  • Yii2:如何在非 Restful API 上允许 CORS

    我正在 Yii2 Framework 上使用预构建的 API 不是 Restfull 它使用 JSON 数据进行响应 并根据用户类型和凭证令牌接受请求 现在我必须制作一个位于不同位置 域 的应用程序 这会导致 CORS 冲突 我的应用程序是
  • 如何在 matlab 中格式化复数以进行文本输出

    我有一个复数 我想使用 fprintf 命令将其输出为文本 我没有看到复数的格式规范 是否有捷径可寻 使用定点格式规范仅输出实部 根据文档fprintf and sprintf 数字转换仅打印复数的实部 所以对于一个复杂的值z你可以用这个
  • Django 错误消息“在定义中添加 related_name 参数”

    D zjm code basic project gt python manage py syncdb Error One or more models did not validate topics topic Accessor for
  • 如何处理 MS Word 添加的“特殊”字符?

    我想知道你如何清理 MS Word 中的特殊字符 例如 m 和 n 破折号以及弯引号 我经常发现自己从 Word 中复制客户端内容并粘贴到静态 HTML 页面中 但内容最终会出现奇怪的字符 因为特殊字符未转换为正确的 ACSII 代码 因此
  • 将字符串转换为 &strs 时,切片和显式重新借用之间有区别吗?

    下面两个例子等价吗 示例1 let x String new let y x 示例2 let x String new let y x 一种比另一种更有效率还是它们基本相同 如果是String and Vec 他们做同样的事情 在gener