当前位置:  开发笔记 > 后端 > 正文

如何实现泛型函数的专用版本?

如何解决《如何实现泛型函数的专用版本?》经验,为你挑选了1个好方法。

我想要为其参数类型优化一个函数的多个版本,并根据上下文调用适当的函数.

在我的例子中,所有参数都具有相同的类型,并且都是等价的,因此它宁可避免使用self参数.

我试过这段代码:

trait Foo { 
    fn foo(a: T, b: T, c: T); 
}

impl Foo {
    fn foo(a: i32, b: i32, c: i32) {}
}

impl Foo {
    fn foo(a: i16, b: i16, c: i16) {}
}

fn main() {
    Foo::foo(1i32,2,3);
    Foo::foo(1i16,2,3);
}

但Rust需要类型注释:

错误:需要输入注释:无法解析_ : Foo[E0283]

我可以避免在呼叫站点提供类型注释吗?如果必须,怎么办?



1> Vladimir Mat..:

请记住,你总是某些东西实现一个特征.因此,特征实现必须始终包含for子句:

impl SomeTrait for Something

如果没有for,那么它不是特质实现.你的情况impl Foo是不是的实现Fooi32或任何你认为它是; 它是裸特征对象类型固有方法声明子句. Foo

你真正想要的是使用Self类型参数:

trait Foo { 
    fn foo(a: Self, b: Self, c: Self); 
}

impl Foo for i32 {
    fn foo(a: i32, b: i32, c: i32) {}
}

impl Foo for i16 {
    fn foo(a: i16, b: i16, c: i16) {}
}

fn main() {
    Foo::foo(1i32,2,3);
    Foo::foo(1i16,2,3);
}

这段代码有效.

请注意,现在Foo针对特定类型实施.通过隐式Self类型参数可以实现为特征实现的类型,您可以看到它在foo()声明中的使用方式.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有