我有这段代码:
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()
}
答案 0 :(得分:3)
&#34;正确&#34;解决方案是将边界放在特征上,但引用相关的类型。在这种情况下,您还可以使用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;
}
然而,这还没有成功。
我相信你需要:
where
clauses on associated types功能
与此同时,解决方法是在所需的任何地方复制绑定:
fn test<I: Bar>(t: I::T) -> String
where
for<'a> &'a I::T: DeserializeOwned,
{
serde_json::to_string(&t).unwrap()
}