【问题标题】:Why doesn't Rust support overloading function or method? [closed]为什么 Rust 不支持重载函数或方法? [关闭]
【发布时间】:2019-06-08 17:33:56
【问题描述】:

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

【问题讨论】:

  • 你永远不需要在Java中定义一个同名的函数,你选择来。
  • @MatthieuM。在 C++ 中,有时您需要 使用相同的名称,因为您想在模板中使用泛型类型的函数。不过这个论点不适用于 Rust。
  • 您可能会发现感兴趣的thisthis
  • @SvenMarnach:是的,这就是我指定 Java 的原因。 Rust 对泛型的特征使用涵盖了 C++ 对模板的重载使用。不过,由于 OP 提到了 Java 而不是 C++,所以我不想把水弄混。

标签: rust


【解决方案1】:

我认为在某种程度上,Rust确实具有函数和方法重载。

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

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

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

在 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 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"
}

【讨论】:

  • 带有不同数量参数的重载呢?
  • @JFFIGK 这不太可能。您可以在不同的特征上拥有相同名称的函数,但编译器不会自动为您选择正确的函数——您需要使用完全限定的语法来选择您想要的函数。并且宏可以是可变参数,所以也许这是您的用例的一个选项。
猜你喜欢
  • 2012-03-11
  • 2022-08-18
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多