为什么Rust不支持重载功能或方法?

时间:2019-06-08 17:33:56

标签: rust

java中的方法重载是非常有用的功能。有时我们需要定义名称相同但参数集不同的函数,我想知道为什么rust不支持此功能?

1 个答案:

答案 0 :(得分:4)

我认为Rust在某些方面确实具有函数和方法重载。

假设您要实现一个abs()函数,该函数可以采用整数或浮点数。在C ++中,您可以使用

int abs(int x) { ... }
double abs(double x) { ... }

这将允许使用abs()int作为参数来调用double,编译器将为您选择正确的实现。

在Rust中,您改用特征。可以在包括标准型在内的外国类型上实现特征,因此这是一个足够的替代:

trait Abs {
    fn abs(self) -> Self;
}

impl Abs for i32 {
    fn abs(self) -> Self { ... }
}

impl Abs for f32 {
    fn abs(self) -> Self { ... }
}

这将允许您调用x.abs(),其中xi32f32,编译器将为您选择正确的实现。

您甚至不仅仅让编译器根据方法接收者来做出决定。如果定义按类型参数化的特征,则编译器将根据其他参数的类型选择方法实现:

trait Trait<T> {
    fn foo(&self, x: T);
}

struct Bar;

impl Trait<i32> for Bar {
    fn foo(&self, _: i32) {
        println!("i32");
    }
}

impl Trait<u32> for Bar {
    fn foo(&self, _: u32) {
        println!("u32");
    }
}

fn main() {
    Bar.foo(1i32);  // prints "i32"
    Bar.foo(1u32);  // prints "u32"
}