互换使用 str 和 String

2024-03-06

假设我正在尝试使用 Rust 做一个奇特的零拷贝解析器&str,但有时我需要修改文本(例如实现变量替换)。我真的想做这样的事情:

fn main() {
    let mut v: Vec<&str> = "Hello there $world!".split_whitespace().collect();

    for t in v.iter_mut() {
        if (t.contains("$world")) {
            *t = &t.replace("$world", "Earth");
        }
    }

    println!("{:?}", &v);
}

但当然String由返回t.replace()活得不够长。有没有好的办法解决这个问题?也许有一种类型的意思是“理想情况下&str但如果有必要的话String“?或者也许有一种方法可以使用生命周期注释来告诉编译器返回的String应该保持存活直到结束main()(或者具有相同的生命周期v)?


Rust 正是你想要的Cow http://doc.rust-lang.org/std/borrow/enum.Cow.html(写入时克隆)类型。

use std::borrow::Cow;

fn main() {
    let mut v: Vec<_> = "Hello there $world!".split_whitespace()
                                             .map(|s| Cow::Borrowed(s))
                                             .collect();

    for t in v.iter_mut() {
        if t.contains("$world") {
            *t.to_mut() = t.replace("$world", "Earth");
        }
    }

    println!("{:?}", &v);
}

正如 @sellibitze 正确指出的那样,to_mut()创建一个新的String这会导致堆分配来存储以前借用的值。如果您确定只有借用的字符串,那么您可以使用

*t = Cow::Owned(t.replace("$world", "Earth"));

如果 Vec 包含Cow::Owned元素,这仍然会丢弃分配。您可以使用以下方法来防止这种情况发生非常脆弱且不安全for 循环中的代码(它直接对 UTF-8 字符串进行基于字节的操作,并依赖于替换恰好是完全相同的字节数这一事实。)。

let mut last_pos = 0; // so we don't start at the beginning every time
while let Some(pos) = t[last_pos..].find("$world") {
    let p = pos + last_pos; // find always starts at last_pos
    last_pos = pos + 5;
    unsafe {
        let s = t.to_mut().as_mut_vec(); // operating on Vec is easier
        s.remove(p); // remove $ sign
        for (c, sc) in "Earth".bytes().zip(&mut s[p..]) {
            *sc = c;
        }
    }
}

请注意,这完全是根据“$world”->“Earth”映射定制的。任何其他映射都需要在不安全代码中仔细考虑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互换使用 str 和 String 的相关文章

  • 映射枚举列表

    我有一个名为 UserPermissions 的表 其中通过 userId 与用户表进行 FK 然后是一个用于枚举字符串值的字符串列 我看到的错误是 NHibernate MappingException 表 UserPermissions
  • std::string substr 方法问题

    你好 我正在写这个方法 我希望它从给定缓冲区中提取给定位置的一部分 我有一个像这样的字符串something one something two我想要得到 一个 这是我的想法 static std string Utils getHeade
  • 如何将字符串转换为二进制?

    我需要一种方法来获取 python 中字符串的二进制表示形式 例如 st hello world toBinary st 是否有一个模块可以以某种巧妙的方式执行此操作 像这样的东西吗 gt gt gt st hello world gt g
  • String.substring 在 Java 中到底做了什么?

    我一直想如果我这样做String s Hello World substring 0 5 然后我就得到一个新字符串s Hello Java API 文档中也记录了这一点 返回一个新字符串 该字符串是该字符串的子字符串 但当我看到下面两个链接
  • 将由空格分隔的整数字符串更改为 int 列表[重复]

    这个问题在这里已经有答案了 我该如何做类似的东西 x 1 2 3 45 87 65 6 8 gt gt gt foo x 1 2 3 45 87 65 6 8 我完全陷入困境 如果我按索引执行此操作 那么超过 1 位数字的数字将被分解 请帮
  • 为什么 C#/.NET 字符串带有长度前缀并以 null 结尾?

    看完之后空终止字符串的基本原理是什么 https stackoverflow com questions 4418708 whats the rationale for null terminated strings和一些类似的问题 我发现
  • 为什么 String 类扩展了 Object

    看着String类声明 你可以看到它扩展了Object class public final class String extends Object implements Serializable Comparable
  • 无法返回对临时值的引用

    我正在尝试学习 Rust 同时我想尝试将结构对象转换为字节数组 但这样做遇到了问题 所以我有这个 struct Node lt a gt id u8 name a str data a str impl lt a gt Node lt a
  • 将长字符串分成 60 个字符的长行,但不要断词

    必须有更好的方法来做到这一点 我只想将长字符串拆分为 60 个字符行 但不要断词 因此 不必添加最多 60 个字符 只需少于 60 个即可 下面的代码是我所拥有的并且它有效 但我认为还有更好的方法 有人吗 修改为使用StringBuilde
  • 是否可以基于正则表达式模式生成示例字符串?

    在我的应用程序中 用户可以在文本框中输入他自己的正则表达式模式 以便他可以强制另一个用户 文本框进行特定输入 用户是否可以看到与他输入的正则表达式匹配的字符串示例 例如 如果他要输入 A Z 2 它会生成一个像 XX 向用户表明他只能输入两
  • 在Python中从字符串中删除除字母数字字符之外的所有内容

    使用 Python 从字符串中去除所有非字母数字字符的最佳方法是什么 中提出的解决方案这个问题的 PHP 变体 https stackoverflow com questions 840948可能会进行一些小的调整 但对我来说似乎不太 Py
  • '&&x' 模式匹配是否会导致 x 被复制?

    在文档中std iter 迭代器 filter https doc rust lang org stable std iter trait Iterator html method filter它解释了值通过引用传递给闭包 并且由于许多迭代
  • 是否可以在不使用连接器的情况下将 C# 变量包含在字符串变量中?

    NET 3 5 C 是否允许我们在字符串变量中包含变量 而无需使用 连接符 或 string Format 例如 在伪中 我使用 符号来指定变量 DateTime d DateTime Now string s The date is d
  • PHP中用逗号分解复杂字符串

    我需要分割一个包含逗号的字符串 我已经找到了类似字符串的东西 str getcsv A B with a comma eh C 但我的字符串是这样的 例如值没有包含字符 A B one two C 我需要分解它并获得 array 3 0 g
  • Rust 模式匹配如何确定绑定变量是引用还是值?

    use crate List Cons Nil derive Debug struct Foo derive Debug enum List Cons i32 Foo Nil impl List fn tail self gt Option
  • 如何将整数日期转换为格式化日期字符串(即 2012009 到 2/01/2009)

    有任何想法吗 我想不出任何办法 我有一个从 csv 文件加载的日期列表 它们被保存为所有整数 或者更确切地说是一串整数 即 2009 年 1 月 1 日 1012009 关于如何将 1012009 变成 1 01 2009 有什么想法吗 T
  • 正则表达式字符串中第一个和最后一个非点的位置

    我希望找到字符串的第一个和最后一个非点元素的位置 理想情况下我想这样做regex在基地R 我已经写过R解决问题的代码 不过 我对一个感兴趣regex解决方案 感谢您的任何建议 这是一个示例数据集和R代码以获得所需的结果 此代码拆分字符串并使
  • 具有指向其自身数据的切片的结构

    我有一个结构 struct Foo lt a gt buf u8 64 slice a u8 该切片应该指向buf结构体的字段 有什么方法可以构造这样的结构吗 就像是 impl lt a gt Foo lt a gt fn new gt F
  • 在 HTML5 Javascript 中将 BlobBuilder 转换为字符串

    function blobToString blob var reader new FileReader var d reader onloadend function d callback reader result console lo
  • 用于解析 Rust 中的匹配臂的递归宏

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

随机推荐

  • C ++对`vtable的未定义引用

    我的问题与我发布的另一个问题有所不同 我一开始使用多个文件 并决定暂时将其全部放入一个 main cpp 文件中 以使其正常工作 主要 cpp include
  • Java 中的 Int 到英语单词

    我在这里想问一些奇怪的事情 我想问是否有任何方法 逻辑可以将整数值转换为包含数字英文单词的字符串值 例如 用户输入 22 并得到输出 22 或 2 Thanks 查看this http www rgagnon com javadetails
  • 如何使用 ASP.NET Identity (OWIN) 访问 Facebook 私人信息?

    我正在 ASP NET MVC 5 中开发一个网站 当前使用 RC1 版本 该网站将使用 Facebook 进行用户身份验证和检索初始个人资料数据 对于身份验证系统 我使用新的基于 OWIN 的 ASP NET Identity 引擎 ht
  • 如果用户使用 Google 登录,ASP.NET Core Identity 2.0 SignoutAsync 不会注销用户

    我已设置并运行 Asp net Core Identity 版本 2 0 我发现 signinManager SignoutAsync用户登录 Google 后不会注销用户 当我返回登录方法时 它仅显示用户已登录 其声明对象仍然完好无损 代
  • 为什么 Python 中没有元组理解?

    众所周知 有列表理解 比如 i for i in 1 2 3 4 并且有字典理解 比如 i j for i j in 1 a 2 b items but i for i in 1 2 3 最终会出现在发电机中 而不是tuple理解 这是为什
  • 创建功能有限的 Java 应用程序的试用版 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找有关如何实现 java 应用程序试用版的想法 大多数帖子都是关于创建试用软件 并限制其停止工作的时间 就我而言 我想创建一个功能有限的
  • 找不到 EditorOptionDefinition 导出错误

    在 Visual Studio 2013 中 尝试打开 C 文件时出现以下错误 No EditorOptionDefinition export found for the given option name Tabs ConvertTab
  • `find -exec` 中这个奇怪的语法是什么?

    最近我遇到了一个奇怪的 bash 脚本 它用于从内部调用自定义 bash 函数find exec 我开发了以下简单的脚本来演示我需要解释的功能 在下面的示例中 函数foo每个都会被调用find result foo echo export
  • 为什么在 Kotlin 中启动新的 Android Activity 需要 Java 类? [复制]

    这个问题在这里已经有答案了 如果我想在 Android 中启动一个新的 Activity 我需要将 Activity 传递给 Intent 但是 不要像这样简单地传递 Kotlin 类 val intent Intent Intent th
  • 如何在 iOS 5 中禁用某些部分显示为 TVOut?

    众所周知 在 iOS 5 中 我们不需要添加单独的 TVOut 功能代码行 他们已将该功能集成为内置功能 我的问题是 如果我的应用程序中有一些可用的自定义视图 但我不想将其显示为 TVOut 演示文稿 该怎么办 它应该仅显示在设备上 而不是
  • 覆盖父级的 CSS 显示属性

    我了解如何覆盖父样式 并且我知道这个示例是人为的 但是有没有一种方法 使用内联 CSS 使子范围显示 即使其父范围设置为不显示 span style display none span style display block Test sp
  • base.html 中的 Django 变量

    base html用作所有其他页面的基本模板 base html有导航栏 在导航栏中 我想显示用户收到的消息数 因此 我需要一个像这样的变量 number of messages in the base html 但是 我应该如何将这个变量
  • 使用 sqlplus 连接到 Oracle 数据库

    我在 Unix 环境中使用以下命令连接 Oracle 数据库 sqlplus test test DESCRIPTION ADDRESS LIST ADDRESS PROTOCOL TCP HOST hostname com PORT 15
  • 无返回值的条件运算符

    我有这个代码 bool value false if value Console Write true else Console Write false 我想通过使用条件运算符来缩短它 但我找不到正确的语法 bool value false
  • 批处理文件保留十行之一

    我有一个包含 n 行的文件 n 超过 1 亿 我想输出一个仅包含 10 行中的 1 行的文件 我无法将文件分成十部分并只保留一部分 因为它必须更加随机 后来我必须进行统计分析 我不能在数据中产生强烈的偏差 我正在考虑读取文件 并为每条记录如
  • Kubernetes 仪表板显示未经授权

    我使用 KUBEADM 工具 IN LOCAL 配置了具有 1 个主节点和 4 个工作节点的 kubernetes 集群 所有节点都运行良好 部署了一个应用程序并能够从浏览器访问该应用程序 我尝试了很多方法使用 kubectl 创建仪表板
  • 如何在 Xcode 中将 OpenSSL 与我的应用程序静态链接?

    我正在使用使用 OpenSSL 加密库的第三方代码 自 OSX 10 7 起 Apple 已弃用 OpenSSL 转而采用他们自己的解决方案 由于我没有加密编码经验 因此我无法移植第三方代码以使用通用加密 因此 为了防止 Apple 稍后可
  • 如何删除字符串中的尾随空格和嵌入空格?

    我正在编写一个程序 将国内和国际帐号转换为 IBAN 号码 首先 我需要形成一个字符串 银行 ID 分行 ID 帐号 ISO 国家 地区代码 这些字段中可能存在尾随空格 但并非每个帐号都具有相同的长度 有些帐号具有分支标识符 而其他帐号则没
  • shared_ptr 析构函数、复制和不完整类型

    我有一个头文件foo h像这样 无关的东西省略 pragma once include
  • 互换使用 str 和 String

    假设我正在尝试使用 Rust 做一个奇特的零拷贝解析器 str 但有时我需要修改文本 例如实现变量替换 我真的想做这样的事情 fn main let mut v Vec lt str gt Hello there world split w