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
相关产品推荐
相关产品推荐

