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