栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Rust: 函数的重载——我做的的一组小实验

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Rust: 函数的重载——我做的的一组小实验

编程的时候,我发现有不少函数能够根据左值类型自动调用重载函数。但是,我知道 Rust 的函数是不支持重载的。所以我打算尝试一下这一”重载“现象是如何实现的。

一、Rust 不支持函数重载

写一段代码:

fn foo() -> i32 {
    123
}

fn foo() -> String {
    "123".into()
}

fn main() {
    let x: i32 = foo();
    println!("{:?}", x);
    let x: String = foo();
    println!("{:?}", x);
}

无法通过编译,原因是 Rust 不支持重载。

二、泛型函数

试验一下泛型函数,结果 OK!

fn foo(v: T) -> T {
    v
}
fn main() {
    let x = foo(123);
    println!("{:?}", x);
    let x = foo(String::from("123"));
    println!("{:?}", x);
}
======== cargorun ========
123
"123"

但是,这个是通过参数类型来进行函数的实现的。能否根据左值类型自动推断泛型函数的实现方式呢?

三、左值自动推断

泛型函数需要函数体中用到的泛型类型需要具有共同的方法,因此需要定义必要的 trait。我写了个例子,左值自动推断代码如下:

trait MakeValue {
    fn make_value() -> T;
}

impl MakeValue for i32 {
    fn make_value() -> i32 {
        123
    }
}

impl MakeValue for String {
    fn make_value() -> String {
        "123".into()
    }
}

fn foo>() -> T {
    T::make_value()
}

fn main() {
    let x: i32 = foo();
    println!("{:?}", x);
    let x: String = foo();
    println!("{:?}", x);
}
======== cargorun ========
123
"123"

和 C++ 相比, Rust 的泛型机制更为现代和成熟。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/879134.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号