gpt4 book ai didi

rust - 替换 Rust Vec 中的部分 &str

转载 作者:行者123 更新时间:2023-11-29 08:25:29 25 4
gpt4 key购买 nike

我写了下面的代码:

use std::str::{from_utf8};

struct JSONPointer {
segments: Vec<String>
}

fn build_json_pointer(s: Vec<String>) -> JSONPointer {
JSONPointer { segments: s.iter().map(|x| x.replace("~1", "/").replace("~0", "~")).collect() }
}

fn main() {
let v = vec!["foo".to_string(), "bar".to_string(), "baz~1".to_string()];
let p = build_json_pointer(v);

println!("Hello world! {:?}", p.segments);
}

这一切都适用于 String s,但最好是我的 JSONPointer结构将包含 Vec<&str> (如果仅用于学习目的)。我遇到的问题发生在对 map 的调用中替换了一些保留字符串。无论我使用哪种转换组合,我总是被告知我的 borrowed value does not live long enough .

我知道我正在引用本地值并尝试返回它(导致可能出现删除后使用错误),但我似乎无法找到获取字符串副本的方法.

编辑:更新为最小可复制形式

我现在意识到,当我指的是想要一个“副本”(堆分配)时,这正是 String是。不过,有人谈论过一种更简洁的方法来做到这一点。

最佳答案

如果您担心不必要地分配字符串,可以使用 Cow :

use std::borrow::Cow;

struct JSONPointer<'a> {
segments: Vec<Cow<'a, str>>,
}

fn replace_if<'a>(s: Cow<'a, str>, from: &str, to: &str) -> Cow<'a, str> {
if s.contains(from) {
Cow::Owned(s.replace(from, to))
} else {
s
}
}

fn build_json_pointer<'a>(s: &[&'a str]) -> JSONPointer<'a> {
let segments = s
.iter()
.copied()
.map(Cow::Borrowed)
.map(|x| replace_if(x, "~1", "/"))
.map(|x| replace_if(x, "~0", "~"))
.collect();

JSONPointer { segments }
}

fn main() {
let v = vec!["foo", "bar", "baz~1"];
let p = build_json_pointer(&v);

println!("Hello world! {:?}", p.segments);
}

这样做的好处是当不需要进行替换时不需要分配任何内存,但缺点是每个模式都被搜索了两次。使用像 rope 这样的结构可能会更有效率.

对于接受 String 的原始情况,您可以在没有 Cow 的情况下通过保留原始 String 而不是无条件地替换它来做类似的事情:

struct JSONPointer {
segments: Vec<String>,
}

fn replace_if(s: String, from: &str, to: &str) -> String {
if s.contains(from) {
s.replace(from, to)
} else {
s
}
}

fn build_json_pointer(s: &[String]) -> JSONPointer {
let segments = s
.iter()
.cloned()
.map(|x| replace_if(x, "~1", "/"))
.map(|x| replace_if(x, "~0", "~"))
.collect();

JSONPointer { segments }
}

fn main() {
let v = vec!["foo".to_string(), "bar".to_string(), "baz~1".to_string()];
let p = build_json_pointer(&v);

println!("Hello world! {:?}", p.segments);
}

关于rust - 替换 Rust Vec 中的部分 &str,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com