Java中的方法重载是一个非常有帮助的功能。有时,我们需要定义具有相同名称但不同参数集的函数。我想知道为什么Rust不支持这个特性。
Java中的方法重载是一个非常有帮助的功能。有时,我们需要定义具有相同名称但不同参数集的函数。我想知道为什么Rust不支持这个特性。
我认为在某种程度上,Rust确实具有函数和方法的重载。
假设你想要实现一个abs()
函数,可以接受整数或浮点数。在C++中,你可以使用
int abs(int x) { ... }
double abs(double x) { ... }
这将允许使用int
或double
作为参数调用abs()
函数,编译器会自动选择正确的实现。
在Rust中,您可以使用特性(trait)来代替。特性可被实现于外部类型,包括标准类型,因此这是一个合适的替代方法:
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"
}