java中的方法重载是非常有用的功能。有时我们需要定义名称相同但参数集不同的函数,我想知道为什么rust不支持此功能?
答案 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()
,其中x
是i32
或f32
,编译器将为您选择正确的实现。
您甚至不仅仅让编译器根据方法接收者来做出决定。如果定义按类型参数化的特征,则编译器将根据其他参数的类型选择方法实现:
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"
}