找不到类型为 Option<&std::ffi::OsStr> 的名为 to_str 的方法?

jam*_*ell 2 rust

这是我当前尝试遍历目录并将文件类型扩展名添加到地图并计算具有该扩展名类型的文件数量。

调用to_str()失败,因为

no method named `to_str` found for type `std::option::Option<&std::ffi::OsStr>` in the current scope [E0599]
Run Code Online (Sandbox Code Playgroud)

我尝试在其他地方转换为字符串,我什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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ead 6

几个问题。

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

但这不是唯一的问题,因为调用to_str()an&OsStr将返回 a Option<&str>,它本身也不是 a 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);
}
Run Code Online (Sandbox Code Playgroud)

它正在操场上奔跑

基本上,我们:

  • unwrapOption<&OsStr>&OsStr
  • 打电话to_str()&OsStr
  • unwrap结果Option<&str>变成了&str
  • Call into(),它将把它转换成 a String(这会调用 的Fromtrait 实现String