#conventions #traits #calling #polymorphism #call #reference #input

按值调用

一种通过参数化函数和特质的调用约定来参数化它们的参数和结果的技巧

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)

MIT 许可证

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 特性的实现者可以选择关联类型 ConventionValRef 还是 Mut,这会切换 <T as By<'a, Self::Convention>>::Type 的结果,分别对应于 T&'a T&'a mut T。同时,对于具体已知的类型的 send 方法的调用者不需要指定调用约定;类型级函数确定它们需要将什么类型作为 send 的参数传递,并且如果调用点已知,会根据该具体类型报告类型错误。

无运行时依赖