代码之家  ›  专栏  ›  技术社区  ›  james-see

找不到“std::option::option”类型的名为“to”str“的方法`

  •  1
  • james-see  · 技术社区  · 7 年前

    下面是我当前尝试遍历一个目录并向映射添加文件类型扩展名,并计算有多少文件具有该扩展名类型。

    呼唤 to_str() 失败是因为

    no method named `to_str` found for type `std::option::Option<&std::ffi::OsStr>` in the current scope [E0599]
    

    我尝试在其他地方转换为字符串,甚至尝试不评估 Option 试着把它按原样插入地图,但也没用。

    extern crate walkdir;
    
    use std::ffi::OsStr;
    use std::path::Path;
    use walkdir::WalkDir;
    
    extern crate serde_json;
    use serde_json::{Map, Number, Value};
    
    fn main() {
        let mut map = Map::new();
        let walker = WalkDir::new("/Users/jamescampbell/").into_iter();
        for entry in walker {
            let entry = entry.unwrap();
            let os_str = OsStr::new(entry.file_name());
            let path = Path::new(os_str);
            let extensioner = path.extension();
            let my_new_string: String = match extensioner.to_str() {
                None => String::from("crap, os_str failed"),
                Some(s) => s,
            };
            println!("should be foo: {}", my_new_string);
            if !map[s] {
                map.insert(s.to_string(), Value::Number(Number::from(1u64)));
            } else {
                map[s] += 1;
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Simon Whitehead    7 年前

    几个问题。

    第一个结果是 extension() 是一个 Option<T> . 具体来说,它是 Option<&std::ffi::OsStr> . 所以你必须打开它:

    但这不是唯一的问题,因为打电话 to_str() 关于一个 &OsStr 将返回 Option<&str> 它本身也不是 String .

    排除了字符串类型之间转换可能被忽略的所有问题…这是对引起您问题的部分的最小再现:

    use std::path::Path;
    use std::ffi::OsStr;
    
    fn main() {
        let os_str = OsStr::new("example.txt");
        let path = Path::new(os_str);
        let extensioner = path.extension();
        let my_new_string: String = extensioner.unwrap().to_str().unwrap().into();
    
        println!("Extension: {}", my_new_string);
    }
    

    Here it is running on the playground

    基本上,我们:

    • unwrap 这个 Option<&OsStr> 变成一个 &OSSTR .
    • 呼叫 ToSt-() &OSSTR
    • 拆开 结果 选项<&str> 变成一个 &str
    • 呼叫 into() 将其转换为 (这将调用 From 特性实现 )
    推荐文章