gpt4 book ai didi

rust - 实现 Index 特征时无约束的生命周期错误

转载 作者:行者123 更新时间:2023-11-29 07:48:53 24 4
gpt4 key购买 nike

我有一个拥有 HashMap<String, String> 的结构,

struct Test {
data: HashMap<String, String>,
}

我正在尝试实现 Index此类型映射到 Index 的特征 HashMap 的实现(涉及其他逻辑,所以我无法公开 HashMap )。

如果我只是获取对散列图中值的引用,这会起作用:

impl<'b> Index<&'b str> for Test {
type Output = String;
fn index(&self, k: &'b str) -> &String {
self.data.get(k).unwrap()
}
}

但是,我想得到&Option<&String>出来,像data.get() .所以我尝试了这个:

impl<'b, 'a> Index<&'b str> for Test {
type Output = Option<&'a String>;
fn index(&'a self, k: &'b str) -> &Option<&'a String> {
&self.data.get(k)
}
}

这导致:

error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
--> <anon>:8:10
|
8 | impl<'b, 'a> Index<&'b str> for Test {
| ^^ unconstrained lifetime parameter

我理解 unconstrained lifetime parameter 中的“'a”。现在'aTest 的生命周期本身,所以我想要(我认为)where 'Self: 'a (所以 self 至少和 'a 一样长)。我似乎无法为 Index 解决这个问题暗示?我尝试了一些添加 PhantomData 的操作到我的Test .但我没有取得任何进展。有什么建议么?

最佳答案

正如评论中指出的那样,您将无法完全按照自己的意愿行事。但是,您真正想要的似乎是复制 HashMapget 方法。所以我建议您自己编写或实现 Deref(并且不是 DerefMut)来为结构的所有者不可变 直接访问内部 HashMap。希望这意味着用户不会搞乱您的结构的内部逻辑。请记住,如果您同时执行这两项操作,则 Deref 将不会用于调用 HashMap::get,因为 Test::get 将可用。

struct FooMap {
data: HashMap<String, String>
}

复制get:

impl FooMap {
pub fn get(&self, index: &str) -> Option<&String> { self.data.get(index) }
}

使用Deref:

impl Deref for FooMap {
type Target = HashMap<String, String>;
fn deref(&self) -> &Self::Target { &self.data }
}

Example code on Rust Playground

关于rust - 实现 Index 特征时无约束的生命周期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41293786/

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