Rust如何实现函数根据用户输入动态返回f32或f64类型值
实现方案说明
Rust是静态强类型语言,所有返回值类型必须在编译期确定,你原本的写法试图通过运行时的字符串参数动态改变返回值类型,不符合Rust的类型规则,下面提供两种常用的实现方案,你可以根据自己的使用场景选择:
方案1:枚举包裹类型(适用运行时动态判断类型场景)
如果你只能在运行时通过传入的字符串参数决定返回类型,可以自定义枚举来包裹f32和f64两种类型,函数返回枚举实例即可:
// 定义枚举包裹两类浮点类型 enum FloatNum { F32(f32), F64(f64), } pub fn test(user_input: &str, number: f32) -> FloatNum { match user_input { "f32" => FloatNum::F32(number), "f64" => FloatNum::F64(number as f64), _ => panic!("仅支持f32和f64两类输出类型"), } }
使用时通过模式匹配取出对应类型的值即可:
let res = test("f64", 3.14); match res { FloatNum::F32(v) => println!("得到f32类型值:{}", v), FloatNum::F64(v) => println!("得到f64类型值:{}", v), }
方案2:泛型加trait限定(适用编译期确定类型场景)
如果你调用函数时就能明确需要的返回类型,更推荐用泛型实现,不需要额外传入字符串参数,性能更高也更符合Rust的设计习惯:
// 定义转换trait trait FromF32 { fn convert(v: f32) -> Self; } // 为f32实现转换trait impl FromF32 for f32 { fn convert(v: f32) -> Self { v } } // 为f64实现转换trait impl FromF32 for f64 { fn convert(v: f32) -> Self { v as f64 } } // 泛型函数,返回类型由调用时指定 pub fn test<T: FromF32>(number: f32) -> T { T::convert(number) }
调用时通过变量类型标注指定返回类型即可:
let res_f32: f32 = test(3.14); // 得到f32类型的返回值 let res_f64: f64 = test(3.14); // 得到f64类型的返回值
内容的提问来源于stack exchange,提问作者daniellga
相关产品推荐
相关产品推荐

