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

如何在Rust中传递二元运算符函数并修改指定示例代码

在Rust中传递二元运算符函数作为数据

要实现你需求的两个目标,我们可以通过泛型结构体来适配任意二元运算符的函数签名,同时直接引用Rust标准库中运算符对应的方法作为数据成员传递。

修改后的完整代码

use std::ops::{Add, Mul};

// 泛型结构体,支持任意二元函数(包括运算符)
struct BinOp<A, B, R> {
    function: fn(A, B) -> R,
}

fn main() {
    // 示例1:传递i32类型的加法运算符
    let add_op: BinOp<i32, i32, i32> = BinOp {
        function: i32::add,
    };
    // 测试调用运算符函数
    println!("3 + 5 = {}", (add_op.function)(3, 5));

    // 示例2:传递f64类型的乘法运算符
    let mul_op: BinOp<f64, f64, f64> = BinOp {
        function: f64::mul,
    };
    println!("2.5 * 4.0 = {}", (mul_op.function)(2.5, 4.0));

    // 示例3:传递自定义二元逻辑的函数(和运算符函数签名一致即可)
    let mod_op: BinOp<i32, i32, i32> = BinOp {
        function: |a, b| a % b,
    };
    println!("10 % 3 = {}", (mod_op.function)(10, 3));
}

核心说明

  1. 泛型适配任意运算符:BinOp<A, B, R>通过三个泛型参数,分别对应二元函数的第一个输入类型、第二个输入类型、返回值类型,能容纳所有符合二元函数签名的运算符或自定义函数。
  2. 直接引用运算符方法:Rust中基本类型的运算符都对应std::ops下的trait方法,比如加法对应Add trait的add方法,直接通过类型::方法名的形式就能获取函数指针。
  3. 灵活调用逻辑:存储的函数指针可以通过(binop.function)(参数1, 参数2)的方式直接调用,和普通函数调用逻辑一致。

如果需要支持闭包或带引用参数的运算符,可以将fn(A, B) -> R替换为Box<dyn Fn(A, B) -> R>,进一步提升灵活性:

use std::ops::Add;

struct BinOp<A, B, R> {
    function: Box<dyn Fn(A, B) -> R>,
}

fn main() {
    // 传递带引用参数的加法逻辑
    let ref_add_op = BinOp {
        function: Box::new(|a: &i32, b: &i32| a + b),
    };
    println!("3 + 5 = {}", (ref_add_op.function)(&3, &5));
}

内容的提问来源于stack exchange,提问作者Dimon Agon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:03:14