为什么 Rust 中 String 隐式转换为 &str?

2024-04-07

考虑以下代码:

let s = String::from("hello");
let mut r = String::new();

for c in s.chars() {
    r.push(c);
}

As chars的方法是&str, 为什么可以String叫它?我想这与coercion,但我不完全理解这种隐式转换。


这个问题实际上涵盖了这一点:Rust 的确切自动解除引用规则是什么? https://stackoverflow.com/questions/28519997/what-are-rusts-exact-auto-dereferencing-rules。这个答案涉及很多内容,所以我会尝试将其应用于您的问题。

引用huon的回答:

该算法的核心是:

  • For each "dereference step" https://github.com/rust-lang/rust/blob/b6d91a2bdac45cd919497a24207fab843124d4ba/src/librustc_typeck/check/method/probe.rs#L166-L196 U (that is, set U = T and then U = *T, ...)
    1. 如果有一个方法bar其中接收器类型(类型self在方法中)匹配U确切地说,使用它(“按值方法” https://github.com/rust-lang/rust/blob/b6d91a2bdac45cd919497a24207fab843124d4ba/src/librustc_typeck/check/method/probe.rs#L793)
    2. 否则,添加一个自动引用(采取& or &mut接收者),并且,如果某些方法的接收者匹配&U, 用它 (“autorefd 方法” https://github.com/rust-lang/rust/blob/b6d91a2bdac45cd919497a24207fab843124d4ba/src/librustc_typeck/check/method/probe.rs#L798)

关键在于“取消引用步骤”:U = *T means let u = Deref::deref(t);, where u: U, t: T。我们一直这样做,直到某些东西不能再被取消引用为止。

按照该算法进行调用s.chars()从你的代码:

  1. First dereference step (no deref):
    1. 你可以打电话吗String::chars(s)? No.
    2. 关于什么&String or &mut String? No.
  2. Second dereference step: <String as Deref>::Target = str, so we are looking for methods of str. let c: str = *s (assuming this DST type was allowed);
    1. 你可以打电话吗str::chars(c)? No.
    2. 你可以打电话吗str::chars(&c)? Yes!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Rust 中 String 隐式转换为 &str? 的相关文章

  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但
  • 循环时,.iter() 与引用 (&) 有何不同?

    在玩 Rust 时 我发现你可以循环Vecs and HashMaps 可能还有其他 通过引用 而不是使用 iter let xs vec 1 2 3 4 5 for x in xs println x x The iter 函数似乎具有相
  • JSON.stringify / 解析带有引号的奇怪内容

    我在解析一些包含引号的 JSON 时遇到了一个奇怪的小问题 我正在使用本机 JSON stringify 和 JSON parse 函数来执行此操作 如果我将一个对象 其中有引号的对象 字符串化 它们就会像人们所期望的那样被转义 如果我然后
  • 字符串包含相同的字符但仍然不同[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个 txt 文件并使用每个句子作为团队的名称 同时使用该名称查找另一个 txt 文件以获取其内容 所有 txt 文件都位于我的资产文件夹的根目录中 第一个 txt 文件工作正常 我使用assetm
  • 在 PHP 中将数组转换为字符串并将其恢复为数组

    我正在使用 Serialize 函数将数组存储在我的 MYSQL 数据库中 然后我在其他页面中取消序列化他 数组结构如下所示 Array 0 gt Array names gt somename1 rating gt 10 1 gt Arr
  • 如何操作 Rust 数组的 2 个可变切片?

    我有一个函数需要对单个数组的两个部分进行操作 目的是能够建立一个 nostd 分配器 可以将更大数组的变量切片返回给调用者 并保留数组的其余部分以供将来分配 这是失败的示例代码 fn split lt a gt mut item a mut
  • 如何将“原始”字符串转换为普通字符串? [复制]

    这个问题在这里已经有答案了 在Python中 我有一个像这样的字符串 x89 n 如何将其解码为普通字符串 例如 x89 n 如果您的输入值为str字符串 使用codecs decode 转换 import codecs codecs de
  • 在 C# 中将字符串转换为类型[重复]

    这个问题在这里已经有答案了 如果我收到一个包含类名称的字符串 并且我想将该字符串转换为真实类型 字符串中的类型 我该怎么做 I tried Type GetType System Int32 例如 它似乎有效 但是当我尝试使用自己的对象时
  • 如果 Java 中的字符串中有多个空格,如何将它们压缩为单词之间的单个空格?

    如果字符串的单词之间有多个空格 The cat sat on the mat 如何将其变成一个单独的空间 The cat sat on the mat 我尝试了这个但没有成功 myText myText trim replace 用正则表达
  • 为什么字符串中的反斜杠(\)在控制台中给出错误

    我有一个像这样的字符串 C projects cisco iwan staging enc enterprise network controller ui plugins iwan 当我粘贴到console然后按回车键 它给出以下错误 U
  • 比较字符变量

    我想在 R Studio 中比较两个不同的字符变量 第一列 BZ Pred 显示参与者预测的 5 个最常用的应用程序 第二列 BZ Act 显示实际使用最多的 5 个应用程序 现在我想创建第三列 如果第一个应用程序被正确猜测 则包含 是 如
  • 字符串中的换行符未写入文件

    我正在尝试编写一个程序来操作从文件中读取的 unicode 字符串 我想到了两种方法 一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其写回另一个文件 另一种方法是读取包含换行符的整个文件 执行几个正则表达式替换 然后将其
  • 语音识别中如何处理同音词?

    对于那些不熟悉什么是同音字 https en wikipedia org wiki Homophone是的 我提供以下示例 我们的 是 嗨和高 到 太 二 在使用时语音API https developer apple com docume
  • 使用 serde 通过数值作为类型标识符对 json 进行反序列化

    我对 Rust 很陌生 并且有 OOP 背景 所以 也许我误解了一些 Rust 基础知识 我想用 serde 解析固定的 json 结构 该结构代表不同的消息类型之一 每条消息都有一个数字type属性来区分它 各个消息类型的确切结构大多不同
  • C# 从字符串中删除 URL

    这看起来非常简单 但我尝试的一切似乎都不起作用 假设我有以下字符串 string myString http www mysite com folder file jpg 我该如何处理它以删除 URL 并仅保留 file jpg 作为字符串
  • 如何使用自定义 llc 编译 Rust 程序?

    我有一个自定义 LLVM 后端 并且想为该自定义 nostd 目标交叉编译 Rust 我想分两步编译 Rust 程序 Using rustc生成 LLVM IR 用我自己的opt and llc将 LLVM IR 转换为机器代码 我尝试使用
  • 我如何从 Rust 的 Vec 中获取项目?

    我正在寻找一种方法consumes a Vec并返回一个元素 无需恢复的开销Vec的不变量的方式remove and swap remove do fn take
  • 当替换器使用变量时,如何调用 Regex::replace_all?

    对于下面的代码 我尝试输出输入单词 后跟随机字符串 第一个函数可以编译 但我不想要它 因为它不使用随机字符串 第二个函数会产生编译器错误 我如何解决它 use regex Regex fn main let cd rust ok but i
  • python中unicode字符串到ascii字符串的近似转换

    不知道这是否微不足道 但我需要将 unicode 字符串转换为 ascii 字符串 并且我不希望周围有所有这些转义字符 我的意思是 是否有可能 近似 转换为一些非常相似的 ascii 字符 例如 Gavin O Connor 转换为 Gav

随机推荐

  • 如何中止存储桶的所有不完整分段上传

    有时 分段上传会因某种原因挂起或无法完成 在这种情况下 您将陷入难以删除的孤立部分 您可以通过以下方式列出它们 aws s3api list multipart uploads bucket BUCKETNAME 我正在寻找方法来中止它们
  • 如何更改过滤器中 http 响应的正文

    我正在尝试使用过滤器来检查响应正文中的 HTML 标记 问题是 如果我改变过滤器中的主体 当它到达客户端时它不会改变 我尝试了此处显示的解决方案 寻找使用 servlet 过滤器将内容插入响应的示例 https stackoverflow
  • Laravel 5:如何将播种器类添加到自动加载?

    我遵循文档 http laravel com docs master migrations database seeding http laravel com docs master migrations database seeding
  • 按 eloquent 中的最佳匹配排序

    我从雄辩的查询中得到了一些结果 我想按最佳匹配对它们进行排序 我怎样才能在 laravel eloquent 中做到这一点 在这里我找到了一些 SQL 解决方案 但我无法在 eloquent 构建器中使用它 SELECT TOP 5 FRO
  • 使用 ogr2ogr 将 svg 转换为 geojson 失败

    我从以下位置下载了芬兰的 svg 地图http www amcharts com svg maps map finland http www amcharts com svg maps map finland 我想将其转换为 topojso
  • 无法在 VSCode 中使用 pygame

    我目前正在做一项任务 我必须完成一些功能并导入 pygame 以便我可以运行一个跑步程序 当我尝试通过运行命令导入 pygame 时pip3 install r requirements txt 有一个需求文本文件 里面只写着 pygame
  • Azure Service Fabric 节点、节点类型、实例和规模集

    在尝试了几天Azure的Service Fabric之后 我仍然对以下四个关键词感到不舒服 实例 节点 节点类型 规模设定 他们的意思是什么 有什么区别 Instance 取决于上下文 它可能意味着虚拟机 服务实例等 Node 集群内的节点
  • Moment.js 如何使用 fromNow() 在几小时内返回所有内容?

    我已经搜索过moment js 文档 http momentjs com docs and 堆栈溢出 https stackoverflow com 的一种使用方法fromNow 功能但在几小时内返回所有内容 我的意思是 moment 20
  • android mms通过mms url下载mms内容

    我正在尝试下载MMS通过 MMS url 获取图片内容 但返回 403 禁止 服务器响应 其中包含无效内容MSISDN数字 我已将我的代码粘贴在下面以供参考 提前致谢 private static boolean downloadThrou
  • 不带 React 的 TypeScript JSX

    我想在 TypeScript 中使用 JSX 语法 但不想使用 React 我在这里看到了其他相关问题的答案 但没有任何内容足够完整或详细 无法提供任何帮助 我读了本指南 https basarat gitbooks io typescri
  • 递归地跟踪带有最终值的嵌套对象键

    给定一个如下所示的对象 可以具有未知数量的嵌套属性 const theme fonts primary Arial secondary Helvetica colors primary green secondary red margin
  • Highchart x 轴标签显示双日期

    我在我的项目中使用 highcharts 它在 x 轴上显示两次日期 如何删除它并在 x 轴上仅获取 1 个日期 Here is the snapshot of how it looks like right now 我怎样才能摆脱双日期显
  • 如何用 MS Word 中的一些计算替换括号中的数字

    当我在文章中间插入新的参考文献时 在 MS Word 中将某些序列号 例如 30 31 32 替换为 31 32 33 时遇到问题 我还没有在 GUI 中找到解决方案 所以我尝试使用 VBA 来进行替换 我在堆栈溢出中发现了类似的问题 MS
  • Reactjs 可以像更改 props 一样更改 onclick 函数名称

    可以更改 onclick 函数 例如更改 props 例如更改 props message to new message 例如 var SmallMessageBox React createClass getDefaultProps fu
  • 识别 PHP 未使用和未定义的变量 sublime

    我正在使用 sublimetext3 未注册 我想知道如何配置 sublime 以显示 php 中未使用和未定义的变量 sublimelinter phplint 做了一些有用的工作 但它无法识别自动加载的类 这在开发时可能非常烦人 我正在
  • 在服务器上运行的 Span 和默认的 asp 标签哪个更好?

    我有一个简单的 asp net 网页 其中包含一个大约 5 个表TR每行有 2TD 在页面加载中 我获取用户数据 5个属性 并在此页面中查看它们 以下是前两行 table tr td FullName td td span span td
  • OpenFire - 使用 PubSub 的永久群聊

    首先从这个问题 Smack openfire 如何让用户永久留在群聊室 https stackoverflow com questions 19653877 asmack openfire how do i keep a user perm
  • Handlebars.js Else If

    我使用 Handlebars js 进行客户端视图渲染 If Else 效果很好 但我遇到过需要 ELSE IF 的 3 路条件 这不起作用 if FriendStatus IsFriend div class ui state defau
  • 动态 fnAddData 时,数据表显示“正在处理...”标签

    我有一个函数可以动态地将数据添加到数据表中 这是函数 function fnClickAddRow for i 0 i lt 10000 i example dataTable fnAddData giCount 1 giCount 2 g
  • 为什么 Rust 中 String 隐式转换为 &str?

    考虑以下代码 let s String from hello let mut r String new for c in s chars r push c As chars的方法是 str 为什么可以String叫它 我想这与coercio