互换使用 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 的相关文章

  • 清理 php 中的句子

    标题可能听起来很奇怪 但我有点尝试设置这个 preg replace 来处理文本区域的混乱写入者 它必须 如果有感叹号 则不应连续出现另一个感叹号 如果有 则逗号胜出 并且必须是 当昏迷前有一个 空格时 应将其减少到零 该句子不能以逗号开头
  • 如何复制/克隆一个既不派生又不派生的结构?

    我正在尝试用 Piston 进行一些游戏编程 但我正在努力解决opengl graphics Texture 因为它没有导出Copy or Clone extern crate piston window extern crate pist
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 字符串被两个不同的分隔符分割

    我有这样的字符串 some dasd dasd dasdas dasdas dasd das dsad 我需要用两个不同的符号将字符串拆分为数组 and 所以我想得到数组 some dasd dasd dasdas dasdas dasd
  • 具有相同引用的字符串连接? [复制]

    这个问题在这里已经有答案了 这是我的代码 我现在对字符串池和 通过此输出进行堆存储 public class String1 public static void main String args TODO Auto generated m
  • 来自字符串的文件大小

    我如何从 php 中的字符串中获取 文件大小 我将字符串作为 blob 放入 mysql 数据库中 并且需要存储 blob 的大小 我的解决方案是创建一个临时文件并将字符串放入临时文件中 现在我可以从 字符串 中获取文件大小 但这个解决方案
  • C++ 清理字符串函数

    我需要为以下字符构建自己的清理函数 n r 0 and CTRL Z 我想确保以下代码能够实现这一目的 并且没有副作用 include
  • 找出段落中出现的单词

    sentence Alice was not a bit hurt and she jumped up on to her feet in a moment words Alice jumped played 我可以使用filterpyth
  • 使用 HashMap 映射 String 和 int

    我有一个显示国家 地区名称的列表视图 我已将名称作为字符串数组存储在 strings xml 中 称为国家 地区名称 在填充 ListView 时 我使用从 strings xml 读取的 ArrayAdapter String count
  • 如何“切换”枚举变体?

    我想编写一个函数 将提供的值切换 切换到枚举中的下一个值并在末尾环绕 enum Direction NORTH SOUTH EAST WEST 例如 NORTH gt SOUTH SOUTH gt EAST EAST gt WEST WES
  • 替换字符串中的换行符 C#

    如何在 C 中替换字符串中的换行符 使用替换为Environment NewLine myString myString Replace System Environment NewLine replacement text add a l
  • C# 使文本框中的一组字符表现得像一个字符

    基本上 我有这样的关键字sin and cos 在文本框中 我希望它的行为像单个字符 当我在下面提到整个字符串时 它指的是字符组 例如 sin Using sin 举个例子 如果插入符号位于此位置 在s 如果你按下del 它将删除整个字符串
  • 为什么这个 Rust 程序忽略不变性

    我有以下 Rust 程序 我希望它会导致编译错误 因为x稍后会重新分配 但它遵守并给出输出 为什么 fn main let x y 1 3 println X is and Y is x y let x i32 565 println No
  • Python 将字符串组合成尽可能短的字符串?

    如果我有一个字符串列表 我想将它们组合成一个具有重叠字符的字符串 如果没有剩余的重叠字符串 请将其添加到末尾 这是一个过于简化的版本 input one two output twone 我正在寻找一种方法来对输入列表中的任意数量的字符串执
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • 字符串文字会被编译器优化吗?

    C 编译器或 NET CLR 是否对字符串文字 常量进行了任何巧妙的内存优化 我可以发誓我听说过 字符串内化 的概念 因此在程序中的任何两位代码中 文字 这是一个字符串 实际上会指代同一个对象 大概是安全的 对于字符串来说是这样的 不可变
  • 如何获取 tokio-io 的 async_read 文件句柄

    我想从文件句柄中流式传输行 但我不知道如何满足File has async read use std fs File use std io BufReader BufRead use tokio core reactor Handle us
  • 如果需要函数类型作为类型参数,如何输入 None?

    假设我有一个需要回调的函数 fn foo
  • 假装 .NET 字符串是值类型

    在 NET 中 字符串是不可变的 并且是引用类型变量 这通常会让新的 NET 开发人员感到惊讶 因为他们的行为可能会将它们误认为是值类型对象 然而 除了使用实践StringBuilder对于长连接 尤其是 在循环中 在实践中是否有任何理由需

随机推荐

  • 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