generics - 非泛型结构可以在 Rust 中实现泛型函数吗?

标签 generics syntax rust

非泛型结构能否在 Rust 中实现泛型函数,其工作方式如下:


struct S;

impl <T> S {
    fn do_something(value : T) {
        //do something
    }
}

fn main() {
    let a = /*a value*/;
    S::do_something(a);
}

如果不是,假设 S 实现了一个通用特征 Tt:


struct S;

impl <T> Tt<T> for S {
    fn a_func(value : T) {
        //do something
    }
}

impl <T> S {
    fn do_something(value : T) {
        //do something
    }
}

fn main() {
    let a = /*a value*/;
    S::do_something(a);
}

有什么办法可以让它发挥作用吗?

最佳答案

您只能为 impl block 声明类型变量,前提是它在类型本身中使用。

但是,您也可以在各个方法上引入新的类型变量:

impl S {
    fn do_something<T>(value: T) {
        //do something
    }
}

这对于作为闭包的参数来说尤其常见,因为每个闭包都有不同的类型,所以这对于您每次都能够使用不同的闭包调用方法是必要的。例如,Iterator::map定义如下:

fn map<B, F>(self, f: F) -> Map<Self, F>
where
    F: FnMut(Self::Item) -> B, 

如果 F 是为类型而不是方法声明的,那么每次调用 map 时都必须使用相同的闭包 - 不是很有用。

关于generics - 非泛型结构可以在 Rust 中实现泛型函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56891094/

相关文章:

javascript - TypeScript 中类型参数的可选计数

arrays - 通用符合协议(protocol)数组

list - Web API 使用附加属性扩展列表

java - 合并两个无序通用数组列表

Python:使用 Pyparser 测试数据的语法无效

function - 定义将参数传递给函数的宏

syntax - 为什么这个 Haskell 不正确?

Matlab矩阵地址

rust - 引用“静态生命周期不长?

rust - 具有特征约束的通用闭包的类型签名