5 个版本
0.2.3 | 2021年4月13日 |
---|---|
0.2.2 | 2021年4月5日 |
0.2.1 | 2021年4月1日 |
0.2.0 | 2021年3月24日 |
0.1.0 | 2020年12月16日 |
#1073 in Rust 模式
43 个月下载量
在 7 个包中使用 (通过 dialectic)
14KB
183 行
Rust 中的调用约定多态
要按调用约定参数化一个函数,我们可以指定它接受一些 T: By<'a, Convention>
,并说明其输入为类型 <T as By<'a, Convention>>::Type
。这本质上是对 Rust 引用运算符的去函数化。
这个技巧可以用来允许特质的实现者选择传递到(或从)该特质中定义的函数中的值(或结果)的调用约定,而不是在特质定义中硬编码。
示例
例如,如果我们想要定义一个可以发送值的通道的抽象。但是,想象一下,一些通道可能需要拥有它们发送的值的所有权,而其他通道可能只需要提供对值的引用。为了将这两个概念统一到一个特质中,我们可以参数化输入值的调用约定
use call_by::{By, Convention};
trait Sender<'a, T>
where
T: By<'a, Self::Convention>,
{
type Convention: Convention;
fn send(&self, value: <T as By<'a, Self::Convention>>::Type);
}
实现 Sender
特性的实现者可以选择关联类型 Convention
是 Val
、Ref
还是 Mut
,这会切换 <T as By<'a, Self::Convention>>::Type
的结果,分别对应于 T
、&'a T
和 &'a mut T
。同时,对于具体已知的类型的 send
方法的调用者不需要指定调用约定;类型级函数确定它们需要将什么类型作为 send
的参数传递,并且如果调用点已知,会根据该具体类型报告类型错误。