为什么在 Rust 中无法在不引用其中之一的情况下连接两个字符串?

2024-04-23

这有效:

let hello = "Hello ".to_string();
let world = "world!";

let hello_world = hello + world;

但这并没有:

let hello = "Hello ".to_string();
let world = "world!".to_string();

let hello_world = hello + world;

但这确实:

let hello = "Hello ".to_string();
let world = "world!".to_string();

let hello_world = hello + &world;

那是因为String需要一个指向第二个原始字符串切片的指针String?如果是这样,为什么?


答案分为两部分。


第一部分是+涉及使用an Add特质实现 https://doc.rust-lang.org/std/ops/trait.Add.html。它仅针对以下目的实施:

impl<'a> Add<&'a str> for String

因此,字符串连接仅在以下情况下有效:

  • 左侧是String
  • 右手边是强制的&str

注意:与许多其他语言不同,加法将消耗左侧参数。


因此,第二部分是当&str是期待?

显然,一个&str可以按原样使用:

let hello = "Hello ".to_string();
let hello_world = hello + "world!";

否则,对实现的类型的引用Deref<&str>会起作用,事实证明String这样做&String works:

let hello = "Hello ".to_string();
let world = "world!".to_string();

let hello_world = hello + &world;

那么其他的实现呢?他们都有问题。

  • impl<'a> Add<String> for &'a str需要前置,这不如附加有效
  • impl Add<String> for String当一个参数就足够时,不必要地消耗两个参数
  • impl<'a, 'b> Add<&'a str> for &'b str隐藏无条件内存分配

最后,尽可能明确的 Rust 哲学解释了不对称选择。

或者更明确地说,我们可以通过检查操作的算法复杂性来解释选择。假设左侧的尺寸为 M,右侧的尺寸为 N,则:

  • impl<'a> Add<&'a str> for String是 O(N)(摊销)
  • impl<'a> Add<String> for &'a str是 O(M+N)
  • impl<'a, 'b> Add<&'a str> for &'b str是 O(M+N)
  • impl Add<String> for String是 O(N) (摊销)...但需要免费分配/克隆右侧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Rust 中无法在不引用其中之一的情况下连接两个字符串? 的相关文章

随机推荐

  • Backbone.js / Marionette.js 中的路由 - 无主题标签、路由列表和子路由器

    我对 Backbone js Marionette js 中的路由有三个问题 1 如何获取我的应用程序路由器已注册的所有路由的列表 例如对于 Express js 在 Node js 中 它将是app routes 我尝试对 Backbon
  • Linux c++:api 与 /proc 文件?

    我正在开发一个应用程序来收集和发送各种系统信息 分区空间 可用空间 笔记本电脑电池信息等 我没有成功地以直接 c api 的形式获取这些信息 尽管它都可以通过 proc 或类似 中的文件获得 所以 我想知道在我的 C 应用程序中读取 解析这
  • 如何获取 bash 中的第 n 个位置参数?

    如何获得nBash 中的第一个位置参数 其中n是变量吗 使用 Bash 的间接功能 bin bash n 3 echo n 运行该文件 ind apple banana cantaloupe dates 生产 cantaloupe Edit
  • Minecraft Forge 1.8 - 加载块纹理

    我刚刚开始学习 Java 同时修改 Minecraft 我看过有关使用 Minecraft Forge API 将块添加到游戏中的教程 但我遇到了问题 不再有 setBlockTextureName 方法 所以我不知道该怎么办 我在游戏中添
  • css 中 & 的作用是什么

    我正在查看一些遗留代码 并在 css 文件中发现如下内容 user modal width auto height auto modal fade in margin top 0 margin left 0 top 83px 这里 的目的是
  • 向后滑动 - InteractivePopGestureRecognizer 不起作用

    我有像这张照片这样的屏幕 HomeViewController 将推送到 maintabbar 并且选项卡栏项目将推送到detailScreen 为什么向后滑动不起作用 我认为这是IOS默认的 请帮我 p s 如果我在 cocoapods
  • 奇怪的 bash 脚本行为 - 生成的命令在复制粘贴时有效,但在脚本中无效

    出于安全原因 我编写了一个简短的 bash 脚本来包装 ansible playbook 命令 这并不复杂 而且大部分脚本在这里都是无关紧要的 最后 我将脚本参数生成的变量中的 ansible 命令放在一起 如下所示 ansible pla
  • Spring:文件上传RESTFUL Web服务

    我正在使用 Spring 4 0 为 RESTFUL Web 服务创建 POC 如果我们只传递字符串或任何其他基本数据类型 它就可以正常工作 RequestMapping value upload file method RequestMa
  • 适用于 MYSQL 的 Logstash Jdbc 输入插件

    我在 Windows 中使用 Logstash 我无法安装输入 jdbc 插件 因此我手动下载了 zip 文件 并将插件中的logstash 文件夹放入我的logstash 1 5 2 文件夹中 文件夹结构 D elastic search
  • Matplotlibight_layout——删除多余的白色/空白区域

    我想尽量减少人物周围的空白 但不确定如何 a 为我的图像周围的 savefig 命令精确指定一个边界框 并且 b 为什么紧密布局命令在我的工作示例中不起作用 In my current example I set up an axis en
  • 使 ASP.NET MVC 应用程序为 Web Farm 做好准备

    使 ASP NET MVC 应用程序 Web 场做好准备的最有效方法是什么 最重要的是共享当前用户的信息 上下文 和 不太重要 缓存的对象 例如查找项目 州 街道类型 县等 我听说过 读过 MemCache 但还没有看到关于如何实现和测试它
  • PHP 将整数转换为 hh:mm:ss

    我有一个 hh mm ss 格式的字符串 我将其转换为表示总秒数的整数 例如 01 43 03 01 3600 43 60 03 1 上面的示例生成整数值 6183 使用该值执行一些逻辑后 我需要将整数转换回严格的 hh mm ss 格式
  • ActiveAdmin:按子对象计数过滤

    在严重依赖 ActiveAdmin 的 Ruby on Rails 应用程序中 我有一个赞助商模型 它与赞助商模型关联 一sponsor可以资助很多孩子 所以一个sponsor可以有很多sponsorships 我想做的是能够在赞助商索引页
  • 无法使用 RVM、Ruby 1.9.2 和 Rails 3 运行 RubyMine 调试器

    我已经设置了全新的 Ubuntu 安装并遵循本指南 http ryanbigg com 2010 12 ubuntu ruby rvm rails and you安装 RVM Ruby 1 9 2 和 Rails 3 然后我安装了RubyM
  • ADAL.js 和 MSAL.js 有什么区别?

    我正在尝试处理使用 Microsoft Graph 的应用程序的身份验证 这两个库有什么区别 JavaScript 的 Active Directory 身份验证库 ADAL js https github com AzureAD azur
  • java中如何读取xep文件数据

    有没有办法在 pdf 完全渲染之前获取总页数并输入我们提供 xml 文件 xslt 是页面布局的样式表 我们使用 RenderX 从 xslt 进行 pdf 转换 将其转换为 xsl fo 文件 从 xsl fo 转换为 xep 文件 从
  • Foreman/Puma 未使用开发环境中指定的端口

    我在 application yml 中将端口设置为 3000 figaro 管理环境变量 rails s使用端口 3000 但当我跑步时foreman start 根据 Heroku 的推荐 我得到以下输出 14 53 23 web 1
  • 错误:找不到函数“geom_sf”

    我目前在 Windows 上运行 R 版本 3 4 2 并拥有 ggplot2 通过 tidyverse 和 sf 包版本 3 4 2 我正在尝试使用 ggplot2 sf 套件来绘制空间数据 尝试运行 geom sf 时 我收到错误 co
  • 为什么我的解密方法抛出“要解密的数据长度无效”加密异常

    这是一个非常常见的异常 但显然我找到的解决方案都没有解决我的问题 我有一个加密和一个解密方法 我加密一个字符串并将其写入文件 然后从文件中读取该字符串并解密 理论上 事实上 我得到了一个 加密异常 要解密的数据长度无效 在该过程的解密方面
  • 为什么在 Rust 中无法在不引用其中之一的情况下连接两个字符串?

    这有效 let hello Hello to string let world world let hello world hello world 但这并没有 let hello Hello to string let world worl