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

Rust中传递执行==并返回i32的函数的最惯用方式是什么?

Rust中传递执行==判断并返回i32的函数的惯用写法

先看你给出的代码场景:

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

fn f(a: i32, b: i32, binop: &dyn Fn(i32, i32) -> i32) -> i32 {
    binop(a, b) as i32
}

fn main() {
    // 使用Sub::sub和Add::add的示例
    println!("{}", f(1, 2, &Add::add));
    println!("{}", f(1, 2, &Sub::sub));

    // 可行但不够简洁的写法
    let eq1 = |a, b| if a == b {1} else {0};
    let eq2 = |a, b| (a == b).into();

    println!("{}", f(1, 2, &eq1));
    println!("{}", f(1, 2, &eq2));

    // 期望的类似写法(无法直接工作)
    // println!("{}", f(1, 2, &PartialEq::eq as i32));
}

核心需求是找到类似&Add::add的简洁写法,传递一个执行==判断并返回i32的函数给f。

为什么不能直接用&PartialEq::eq?

PartialEq::eq的签名是fn(&self, other: &Self) -> bool,和f要求的Fn(i32, i32) -> i32存在两个不匹配:

  • 参数是引用类型,而f接收的是值类型参数
  • 返回值是bool,而f要求返回i32

几种惯用实现方式

1. 简洁闭包适配(推荐)

用闭包直接完成参数适配和类型转换,这是Rust中最常用的简洁写法:

// 显式类型转换
println!("{}", f(1, 2, &|a, b| (a == b) as i32));
// 利用Into trait自动转换(i32实现了From<bool>,因此可以用into)
println!("{}", f(1, 2, &|a, b| (a == b).into()));

2. 定义复用适配函数

如果需要多次使用这个逻辑,单独定义一个函数,用法和Add::add完全一致:

fn eq_to_i32(a: i32, b: i32) -> i32 {
    (a == b).into()
}

// 调用时直接传递函数引用
println!("{}", f(1, 2, &eq_to_i32));

3. 现有写法优化

你写的eq2已经符合惯用风格,利用trait进行类型转换比eq1的显式if-else更简洁。如果要进一步简化,可以直接把闭包内联到调用中,不需要单独绑定变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:35:38