如何确保特质内的特质边界?

4

如果我有以下类似的特征Foo

trait Foo: Bar {
  type Account: SomeTrait;
}

这里有一个需要 Bar 的 trait bound。

trait Bar {
  type UserId;
}

我如何在Foo特性中请求,要求Bar特性内的UserId类型为u32
重要提示:我不能编辑Bar特性。

解决这个问题的一种方法是将Bar重写为通用特征。通常,您希望像您所做的那样编写它,但在您的情况下,您确实希望能够指定类型。因此,使Bar成为通用的。trait Bar<T> { ... }允许您编写trait Foo: Bar<u32> { ... } - BitTickler
@BitTickler 这是一个解决方案,但我不能真正改变Bar trait,还有其他的想法吗? - Szegoo
1
我犹豫是否要写一个答案,因为如果我发布未经测试的片段,很可能会出错。而且为此设置一个货物项目等等太麻烦了。但是,如果您无法重写Bar,仍然可以做一个通用的 trait NarrowedBar<T>: Bar { UserId = T; } 的东西。 - BitTickler
1
@BitTickler Rust有一个playground专门为这种情况而设。 - jthulhu
1个回答

4

可以将其指定为一个命名的通用参数:Bar<UserId=u32>

trait SomeTrait {}

trait Foo: Bar<UserId=u32> {
    type Account: SomeTrait;
}

trait Bar {
    type UserId;
}

请查看代码演示平台


1
https://doc.rust-lang.org/book/ch19-03-advanced-traits.html(一大堆文字)应该会更容易找到这个巧妙的技巧。 - BitTickler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接