函数输出类型随输入变化

dan*_*lga 1 rust

我有一个这样的函数,其中函数的用户指定输出的类型:

pub fn test(user_input: &str, number: f32) -> ??? {
    if user_input == "f32"{
        number as f32
    } else if user_input == "f64" {
        number as f64
    } else {
        panic!();
    }
}
Run Code Online (Sandbox Code Playgroud)

我对 Rust 比较陌生,所以我问你,如何让这个函数返回用户要求的类型?我只对 f32 和 f64 输出感兴趣。

Jan*_*dec 5

你不能。Rust 是静态类型语言,因此必须在编译时知道类型。它不能依赖于用户输入。

\n

您可以做的是定义一个联合类型,例如:

\n
enum Float {\n    Single(f32),\n    Double(f64),\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后写

\n
pub fn test(user_input: &str, number: f32) -> Float {\n    if user_input == "f32"{\n        Single(number as f32)\n    } else if user_input == "f64" {\n        Double(number as f64)\n    } else {\n        panic!();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我不明白这样的功能有什么用处。

\n

更新:或者你可以创建一个共同的特征,但在返回位置你必须将它装箱。喜欢:

\n
trait Float { \xe2\x80\xa6 }\n\nimpl Float for f32 { \xe2\x80\xa6 }\n\nimpl Float for f64 { \xe2\x80\xa6 }\n
Run Code Online (Sandbox Code Playgroud)\n

然后写

\n
pub fn test(user_input: &str, number: f32) -> Box<dyn Float> {\n    if user_input == "f32"{\n        Box::new(number as f32)\n    } else if user_input == "f64" {\n        Box::new(number as f64)\n    } else {\n        panic!();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这对于大型对象(例如具有关联编解码器的整个缓冲区)有意义,但对于单个值,开销相对较大。

\n