我有这个代码:
extern crate serde;
use serde::de::DeserializeOwned;
use serde::Serialize;
trait Bar<'a, T: 'a>
where
T: Serialize,
&'a T: DeserializeOwned,
{
}
我想使用关联类型来编写此代码,因为类型 T
对该类型的用户而言并不重要。我做到了这一点:
trait Bar {
type T: Serialize;
}
我不知道如何指定另一个边界。
最终,我想使用这样的函数:
extern crate serde_json;
fn test<I: Bar>(t: I::T) -> String {
serde_json::to_string(&t).unwrap()
}
最佳答案
“正确”的解决方案是将界限放在特征上,但引用关联的类型。在这种情况下,您还可以使用 higher ranked trait bounds处理引用:
trait Bar
where
Self::T: Serialize,
// ^^^^^^^ Bounds on an associated type
for<'a> &'a Self::T: DeserializeOwned,
// ^^^^^^^^^^^ Higher-ranked trait bounds
{
type T;
}
但是,这还行不通。
我相信您将需要:
- 等待issue 20671和/或 issue 50346等待修复。
- 等待 generic associated types介绍
where
clauses on associated types 的功能.
与此同时,解决方法是在需要的地方复制绑定(bind):
fn test<I: Bar>(t: I::T) -> String
where
for<'a> &'a I::T: DeserializeOwned,
{
serde_json::to_string(&t).unwrap()
}
关于generics - 如何为对特征本身的关联类型的引用编写特征绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50776093/