Generics 如何为trait本身上关联类型的引用编写trait绑定?

Generics 如何为trait本身上关联类型的引用编写trait绑定?,generics,rust,constraints,traits,serde,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, { } 我不知道如何指定另一个边界 最后,我想使用如下函数: extern crate serde_json; fn test<I: Bar>(t

我有以下代码:

extern crate serde;

use serde::de::DeserializeOwned;
use serde::Serialize;

trait Bar<'a, T: 'a>
where
    T: Serialize,
    &'a T: DeserializeOwned,
{
}
我不知道如何指定另一个边界

最后,我想使用如下函数:

extern crate serde_json;

fn test<I: Bar>(t: I::T) -> String {
    serde_json::to_string(&t).unwrap()
}
extern板条箱serde_json;
fn测试(t:I::t)->字符串{
serde_json::to_字符串(&t).unwrap()
}
正确的解决方案是在trait上放置边界,但引用关联的类型。在这种情况下,还可以使用来处理引用:

trait Bar
where
    Self::T: Serialize,
//  ^^^^^^^ Bounds on an associated type  
    for<'a> &'a Self::T: DeserializeOwned,
//  ^^^^^^^^^^^ Higher-ranked trait bounds       
{
    type T;
}

谢谢,我不知道在那种情况下你可以
Self
。但它似乎不像我预期的那样起作用。我有这个函数:
fn test(t:I::t)->String{serde_json::to_String(&t).unwrap()}
。编译失败,原因是“特质
for@corvus_192我认为这是因为
test
的签名中没有
I
供编译器查看。您可以实现多个类型
I
,其中
::T
是同一件事,对吗?@trentcl在我的例子中,只有一个Bar实现,但显然可能不止一个。只要每个实现都提供一个满足给定边界的类型T,那么这又有什么关系呢?@corvus_192编译器并不擅长证明通用命题。像
fn test(t:I::t)->String
这样的签名意味着您可以选择实现
Bar
的任何
I
,编译器必须证明每个
I
都有一个
反序列化的
impl,其中
:t
t
的实际类型。我解释得不好。关键是,它在逻辑上是合理的,但是编译器不能证明没有一些
&::t
不能实现
反序列化所有的
I
。所有这些的结果是,您必须为
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()
}