gpt4 book ai didi

rust - 关联类型的界限,但 'error: the type of this value must be known in this context'

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

以下

use std::borrow::Borrow;

trait DictLike<'a> {
type Label: Eq + 'a;
type ItemsIterator: Iterator<Item=(&'a Self::Label, &'a DictLike<'a>)> + 'a;

fn items(&self) -> Self::ItemsIterator;

fn get<Q: ?Sized + Eq>(&self, key: &Q) -> Option<&'a DictLike<'a>>
where Self::Label: Borrow<Q> {
for (k,v) in self.items() {
if k.borrow().eq(key) {
return Some(v);
}
}
None
}
}

错误输出为

lib.rs:12:16: 12:26 error: the type of this value must be known in this context
lib.rs:12 if k.borrow().eq(key) {
^~~~~~~~~~

为什么?没有 ItemsIterator的类型绑定(bind)和绑定(bind) Self::Label: Borrow<Q>提供必要的类型信息?

最佳答案

这似乎是一个错误:<'a>在特征声明中似乎导致编译器感到困惑,例如:

trait DictLike<'a> {
type ItemsIterator: Iterator<Item=u8>;

fn items(&self) -> Self::ItemsIterator;

fn get(&self) {
for k in self.items() {}
}
}
<anon>:7:13: 7:14 error: unable to infer enough type information about `_`; type annotations required [E0282]
<anon>:7 for k in self.items() {}
^

删除 'a允许该代码编译。我已经提交了 #24338关于这个。

幸运的是,有一个变通办法:这似乎只发生在代码在默认方法内部时,将实际实现移至外部函数工作正常:

use std::borrow::Borrow;

trait DictLike<'a> {
type Label: Eq + 'a;
type ItemsIterator: Iterator<Item=(&'a Self::Label, &'a DictLike<'a>)> + 'a;

fn items(&self) -> Self::ItemsIterator;

fn get<Q: ?Sized + Eq>(&self, key: &Q) -> Option<&'a DictLike<'a>>
where Self::Label: Borrow<Q> {
get(self, key)
}
}

fn get<'a, X: ?Sized + DictLike<'a>, Q: ?Sized + Eq>(x: &X, key: &Q) -> Option<&'a DictLike<'a>>
where X::Label: Borrow<Q> {
for (k,v) in x.items() {
if k.borrow() == key {
return Some(v);
}
}
None
}

除了可以编译之外,这在功能上与原始代码没有什么不同。 (我冒昧地将 .eq 调用切换为 == 运算符,这是方法调用的更好糖分。)

此外,如果您想多尝试一下迭代器,可以写成 get作为

x.items()
.find(|&(k,_)| k.borrow() == key)
.map(|(_, v)| v)

使用 Iterator::find Option::map .

关于rust - 关联类型的界限,但 'error: the type of this value must be known in this context',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29582740/

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