求解Rust代码中f1d_array的类型,用于定义函数入参
变量
f1d_array的具体类型说明 在Rust中,闭包的类型是匿名的,无法直接写出具体的类型名称,但我们可以通过特征约束来描述它,或者用泛型、装箱的方式来适配函数参数需求。
1. 类型本质描述
f1d_array是一个长度为3的数组,数组内每个元素是嵌套闭包:
- 外层闭包接收
[f64; 3]类型参数,返回一个内层闭包; - 内层闭包接收
f64类型参数,最终返回f64。
2. 定义接收该参数的函数的两种方式
方式一:泛型特征约束(无装箱,性能更优)
利用泛型匹配闭包的特征约束,无需显式写出匿名类型:
fn use_f1d_array<F, G>(arr: [F; 3]) where F: Fn([f64; 3]) -> G, G: Fn(f64) -> f64, { // 示例用法 let pt = [0., 1., 2.]; let f0 = arr[0](pt); assert_eq!(f0(0.), 3.); }
方式二:动态分发(装箱)
如果需要更灵活的类型抽象,可以用Box<dyn Fn(...)>对闭包进行装箱:
// 定义类型别名简化嵌套闭包的特征描述 type InnerFn = Box<dyn Fn(f64) -> f64>; type F1dArray = [Box<dyn Fn([f64; 3]) -> InnerFn>; 3]; // 接收该类型参数的函数 fn use_f1d_array_dyn(arr: F1dArray) { // 示例用法 let pt = [0., 1., 2.]; let f0 = arr[0](pt); assert_eq!(f0(0.), 3.); }
3. 为什么无法写出具体类型名称?
Rust中每个闭包都有唯一的匿名类型,即使签名一致,捕获不同环境变量的闭包类型也不相同。这里f1d_array的三个元素分别捕获了0、1、2三个不同的dir值,因此每个元素的类型都是独特的,但它们都满足上述的Fn特征约束,所以可以通过泛型或动态分发来统一处理。
内容的提问来源于stack exchange,提问作者Massimiliano Martinelli
相关产品推荐
相关产品推荐

