动态推断字符串的类型

Bie*_*ela 3 rust

这里生锈新手.在给定字符串的情况下动态推断最可能类型的最佳方法是什么?我试图编写一个函数,给定一个字符串返回最可能的类型,但我不知道从哪里开始.在Python中我可能会使用一个try-except块.这是我期望的:

"4" -> u32 (or u64)
"askdjf" -> String
"3.2" -> f64
Run Code Online (Sandbox Code Playgroud)

等等?我知道有些字符串可以分配给几种可能的类型,所以问题没有明确定义,但我只对如何有效地解决问题的一般理念感兴趣.

Fra*_*gné 8

parse字符串slices(&str)上有一个方法,它尝试将字符串解析为特定类型.但是,你必须知道你准备好处理的具体类型.该parse方法可以返回任何实现类型的值FromStr.

fn main() {
    if let Ok(i) = "1".parse::<u32>() {
        println!("{}", i);
    }
    if let Ok(f) = "1.1".parse::<f64>() {
        println!("{}", f);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,::<T>只有在编译器无法推断您要解析的类型时,才需要该部件(在这种情况下,您将遇到编译器错误).


Luk*_*odt 5

我试图编写一个函数,给定一个字符串返回最可能的类型,但我不知道从哪里开始.

首先:Rust是静态类型的,这意味着一个函数只返回一个类型,因此你不能只返回不同的类型,比如动态类型语言.但是,有一些方法可以模拟动态类型 - 即两个(我能想到):

  1. enum:如果您有可能类型的固定数量,则可enum以为每种类型定义一个变体,如下所示:

    enum DynType {
        Integer(i64),
        Float(f32),
        String(String),
    }
    
    fn dyn_parse(s: &str) -> DynType {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

    您可以enum本书和以下Rust书中阅读更多内容.

  2. 标准库中有一个特性,用于模拟动态类型:Any.有更多的信息在这里.您的代码可能如下所示:

    fn dyn_parse(s: &str) -> Box<Any> {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

    你不能直接返回trait对象,所以你必须把它放在一个Box.

请记住,这两种可能性都要求您的功能用户进行额外的调度.由于Rust是静态类型的,因此您无法以动态类型语言执行习惯操作.

也许你应该尝试以一种在静态类型世界中更有意义的不同方式来解决你的问题.


关于实现部分:像FrancisGagné所说,有parse一些尝试将字符串解析为程序员指定的类型.你当然可以parse用不同的类型链接那些调用,然后取第一个成功的调用.但这可能不是你想要的,也许不是最快的实现.

当然,您应该首先考虑字符串应该解析为什么类型的确切规则.之后,您可以构建一个检测字符串类型的有限状态机.正确地做到这一点可能有点棘手.