You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Rust的add函数以支持i64与f64的混合相加?

问题:实现支持i64和f64混合相加的add函数

我想编写一个add函数,参数可以是i64或f64类型。目前实现的代码仅能处理同类型参数相加:

use std::ops::Add;

fn add<T: Add<Output = T>>(a: T, b: T) -> T{
    a + b
}

fn main() {
    let a: i64 = 10;
    let b: i64 = 20;
    let c: f64 = 10.5;
    let d: f64 = 20.5;

    println!("{:?}", add(a, b)); // Outputs: 30
    println!("{:?}", add(c, d)); // Outputs: 31.0
}

需要修改该函数,使其支持i64与f64混合相加,规则为:只要任一参数是f64,就自动转换类型并返回f64;仅当两个参数均为i64时,返回i64。具体类型对应关系如下:

a的类型b的类型返回类型
i64i64i64
i64f64f64
f64i64f64
f64f64f64

修改后的main函数需输出如下结果:

fn main() {
    let a: i64 = 10;
    let b: i64 = 20;
    let c: f64 = 10.5;
    let d: f64 = 20.5;

    println!("{:?}", add(a, b)); // Outputs: 30    | i64 + i64 -> i64
    println!("{:?}", add(a, c)); // Outputs: 20.5  | i64 + f64 -> f64
    println!("{:?}", add(c, a)); // Outputs: 20.5  | f64 + i64 -> f64
    println!("{:?}", add(c, d)); // Outputs: 31.0  | f64 + f64 -> f64
}

解决方案:实现多态add函数

直接通过函数重载(利用Rust对不同参数类型组合的同名函数支持)即可实现需求,代码如下:

// 处理两个i64相加,返回i64
fn add(a: i64, b: i64) -> i64 {
    a + b
}

// 处理i64 + f64,返回f64
fn add(a: i64, b: f64) -> f64 {
    a as f64 + b
}

// 处理f64 + i64,返回f64
fn add(a: f64, b: i64) -> f64 {
    a + b as f64
}

// 处理两个f64相加,返回f64
fn add(a: f64, b: f64) -> f64 {
    a + b
}

fn main() {
    let a: i64 = 10;
    let b: i64 = 20;
    let c: f64 = 10.5;
    let d: f64 = 20.5;

    println!("{:?}", add(a, b)); // 输出: 30
    println!("{:?}", add(a, c)); // 输出: 20.5
    println!("{:?}", add(c, a)); // 输出: 20.5
    println!("{:?}", add(c, d)); // 输出: 31.0
}

思路说明

  • Rust允许同名函数存在,只要它们的参数类型组合不同,编译器会自动匹配对应的函数。
  • 混合类型场景下,将i64转换为f64后执行加法,确保返回浮点类型,符合需求中的类型提升规则。
  • 纯i64场景保持原有整数加法逻辑,避免不必要的类型转换开销。

如果需要支持更多数字类型,可以通过定义自定义trait实现更通用的类型转换逻辑,但针对仅支持i64和f64的场景,直接重载函数是最简洁的方案。


内容的提问来源于stack exchange,提问作者Olivier Lasne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:05:24