gpt4 book ai didi

rust - 没有为类型 Option<&std::ffi::OsStr> 找到名为 to_str 的方法?

转载 作者:行者123 更新时间:2023-11-29 08:13:40 26 4
gpt4 key购买 nike

这是我目前尝试遍历一个目录并向 map 添加文件类型扩展名并计算有多少文件具有该扩展名类型。

to_str() 调用失败,因为

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

我尝试在其他地方转换为字符串,甚至尝试不评估 Option 并尝试将其按原样插入到 map 中,但这也没有用。

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;
}
}
}

最佳答案

几个问题。

第一个是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 .
  • 调用to_str()&OsStr
  • unwrap结果 Option<&str>进入 &str
  • 调用into() , 这会将其转换为 String (这会调用 FromString 特性实现)

关于rust - 没有为类型 Option<&std::ffi::OsStr> 找到名为 to_str 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54488669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com