【问题标题】:How does Rust manage to have generics without overloaded functions?Rust 如何在没有重载函数的情况下实现泛型?
【发布时间】:2014-08-23 18:44:58
【问题描述】:
fn add<T: Add<T,T>>(a: T, b: T) -> T{
    a + b
}
fn main() {

    println!("{}", add(10i,5));
}

我知道 Rust 不允许重载函数。

1.) add 是在编译时生成的吗?

2.) 如果 1.) 为真,它如何在没有重载函数的情况下实现这一点?

在我的脑海中,编译器会生成

fn add(a: i32, b: i32) -> i32{
    a + b
}

fn add(a: f32, b: f32) -> f32{
    a + b
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    通常函数重载意味着你自己可以定义具有相同名称但具有不同参数集的函数。由于 Rust 没有重载,它不会编译第二段代码。

    不过,泛型可用于实现简单形式的重载 - 当“重载”函数具有完全相同的实现,但适用于不同类型时。

    所以,您的两点都是正确的:add() 在编译时生成的,是的,您提供的 sn-p 正是编译器会生成的东西(函数名称除外, 当然);就是重载与此无关。

    【讨论】:

    • 在 C++ 中,这将是重载函数和函数模板的完全特化之间的区别。它们的用途相似(因此不推荐使用后者),因此 Rust 使事情变得更简单,并且只留下了一种方法来进行泛型,从而消除了重复。
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多