gpt4 book ai didi

rust - 如何在函数中使用递归关联类型?

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

我正在尝试编写一个函数,该函数可以下降到任何类型的 Value 并通知 Delegate 它观察到的相似之处。这个想法是让这项工作普遍适用于所有类型的 Json/Yaml/YouNameIt 值。

这是触发问题的 MVCE ( playground link ):

pub trait Value: PartialEq<Self> {
type Item;
type Key;
fn items<'a>(&'a self) -> Option<Box<Iterator<Item = (Self::Key, &'a Self::Item)> + 'a>>;
}

pub trait Delegate<'a, V> {
fn something(&mut self, _v: &'a V) {}
}

pub fn diff<'a, V, D>(l: &'a V, d: &'a mut D)
where V: Value,
<V as Value>::Item: Value,
D: Delegate<'a, V>
{
d.something(l);
let v = l.items().unwrap().next().unwrap();
d.something(v.1);
}

struct Recorder;
impl<'a, V> Delegate<'a, V> for Recorder {}

#[derive(PartialEq)]
struct RecursiveValue;

impl Value for RecursiveValue {
type Key = usize;
type Item = RecursiveValue;
fn items<'a>(&'a self) -> Option<Box<Iterator<Item = (Self::Key, &'a Self::Item)> + 'a>> {
None
}
}

fn main() {
let v = RecursiveValue;
let mut r = Recorder;
diff(&v, &mut r);
}

尝试编译代码时,会产生以下错误:

error[E0308]: mismatched types
--> <anon>:19:17
|
19 | d.something(v.1);
| ^^^ expected type parameter, found associated type
|
= note: expected type `&'a V`
= note: found type `&<V as Value>::Item`

我想说的是关联的 Item 类型也是 V 类型。有没有办法让这种算法通用?

最佳答案

答案就在Associated Types 的最底部Rust Book 的章节。

在绑定(bind)中使用通用类型时,如 V: Value , 可以通过使用 Generic<AssociatedType = SpecificType> 将其关联的一个或多个类型限制为特定类型语法。

在您的情况下,这意味着限制 VValue<Item = V> .这也应该消除任何进一步约束的理由 V::Item自边界到 V自然可用。


我确实鼓励您阅读这本书以帮助您学习 Rust,或者至少浏览一下它以了解那里有什么可用,并在遇到困难时能够引用它。

关于rust - 如何在函数中使用递归关联类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41911228/

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