如何写一个特征绑定引用特征本身的关联类型?

时间:2018-04-29 19:43:00

标签: generics rust constraints traits serde

我有这段代码:

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()
}

1 个答案:

答案 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;
}

然而,这还没有成功。

我相信你需要:

与此同时,解决方法是在所需的任何地方复制绑定:

fn test<I: Bar>(t: I::T) -> String
where
    for<'a> &'a I::T: DeserializeOwned,
{
    serde_json::to_string(&t).unwrap()
}