generics - 如何为对特征本身的关联类型的引用编写特征绑定(bind)?

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

最佳答案

“正确”的解决方案是将界限放在特征上,但引用关联的类型。在这种情况下,您还可以使用 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;
}

但是,这还行不通。

我相信您将需要:

与此同时,解决方法是在需要的地方复制绑定(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/

相关文章:

javascript - 算法题: Packing rods into a row

java - 从我的自定义 ArrayList 类返回随机元素?

javascript - 为什么 WebAssembly 这么慢?

rust - 我可以从函数中自动返回 Ok(()) 或 None 吗?

c++ - 有关如何使 Z3 更快地评估简单约束的建议

T-SQL:DBCC CHECKCONTRAINTS 之后有什么办法回滚吗?

c# - 通用类型列表

java - 了解Java中泛型的使用

java - 我可以有一个类字段,它是必须扩展另一个类和接口(interface)的类型的 Class<?> 吗?

rust - 在 Rust 中为 vector 的每个元素添加一个新键