gpt4 book ai didi

string - 如何与 Rc 共享字符串的一部分?

转载 作者:行者123 更新时间:2023-12-05 01:59:43 25 4
gpt4 key购买 nike

我想用 Rc 创建一些对 str 的引用,而不是克隆 str:

fn main() {
let s = Rc::<str>::from("foo");
let t = Rc::clone(&s); // Creating a new pointer to the same address is easy
let u = Rc::clone(&s[1..2]); // But how can I create a new pointer to a part of `s`?

let w = Rc::<str>::from(&s[0..2]); // This seems to clone str
assert_ne!(&w as *const _, &s as *const _);
}

playground

我该怎么做?

最佳答案

虽然原则上可行,但标准库的 Rc不支持您尝试创建的情况:对引用计数内存的部分 的计数引用。

但是,我们可以使用围绕 Rc 的相当简单的包装器来获得字符串的效果它记住子字符串范围:

use std::ops::{Deref, Range};
use std::rc::Rc;

#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct RcSubstr {
string: Rc<str>,
span: Range<usize>,
}

impl RcSubstr {
fn new(string: Rc<str>) -> Self {
let span = 0..string.len();
Self { string, span }
}
fn substr(&self, span: Range<usize>) -> Self {
// A full implementation would also have bounds checks to ensure
// the requested range is not larger than the current substring
Self {
string: Rc::clone(&self.string),
span: (self.span.start + span.start)..(self.span.start + span.end)
}
}
}

impl Deref for RcSubstr {
type Target = str;
fn deref(&self) -> &str {
&self.string[self.span.clone()]
}
}

fn main() {
let s = RcSubstr::new(Rc::<str>::from("foo"));
let u = s.substr(1..2);

// We need to deref to print the string rather than the wrapper struct.
// A full implementation would `impl Debug` and `impl Display` to produce
// the expected substring.
println!("{}", &*u);
}

这里缺少很多便利,例如 Display 的合适实现, Debug , AsRef , Borrow , From , 和 Into — 我只提供了足够的代码来说明它如何工作。一旦补充了适当的特征实现,它应该和 Rc<str> 一样有用。 (有一个边缘情况,它不能传递给想要存储 Rc<str> 的库类型特别是)。

crate arcstr 声称提供了这个基本思想的完成版本,但我没有使用或研究过它,所以不能保证它的质量。

crate owning_ref 提供了一种方法来保存对 Rc 或其他智能指针的部分的引用,但有人担心它的可靠性,我不完全理解适用于哪些情况(issue search 目前有 3 个 Unresolved 问题)。

关于string - 如何与 Rc 共享字符串的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67659289/

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