- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我目前尝试遍历一个目录并向 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
(这会调用 From
的 String
特性实现)关于rust - 没有为类型 Option<&std::ffi::OsStr> 找到名为 to_str 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54488669/
我想定义一个 OsStr 常量来进行多次扩展比较。例如: const DCM_EXTENSION: Option = Some("dcm"); const DCM_EXTENSION: Option
我正在尝试为文件路径创建一个新名称。一切正常,除了当我尝试格式化 OsStr 时,它会自动将它们放在引号中。这让我发疯了几个小时,无论我使用 {:?} 格式还是 {:#?},它都没有改变任何事情。我也
传递或表示 &[&OsStr] 的惯用方式是什么?这种方式似乎有很多不必要的文字: fn foo(file: &OsStr) { Command::new("bar") .ar
我正在尝试匹配一个文件扩展名: let file_path = std::path::Path::new("index.html"); let content_type = match file_pa
我正在编写一些使用 ? 的 Rust 代码运算符(operator)。这是该代码的几行: fn files() -> Result, Box> { let mut file_paths: Ve
我正在使用 rust-fuse ,它将挂载选项作为 &[&std::ffi::os_str::OsStr]。看来我应该拆分传入的以逗号分隔的选项字符串,我这样做是这样的: mod fuse {
我在 Windows 上有一个 std::ffi::OsString,但我需要将一个 std::ffi::CString 传递给 FFI 函数。有什么方法可以将 OsString 转换为 CStrin
这个问题在这里已经有了答案: What is the right way to allocate data to pass to an FFI call? (1 个回答) Calling the G
我有一个函数接受带有参数 data: *const u8, length: usize 的回调,它表示一些路径。从中创建 OsStr(ing) 的正确方法是什么? OsStrExt 中有from_by
这是我目前尝试遍历一个目录并向 map 添加文件类型扩展名并计算有多少文件具有该扩展名类型。 to_str() 调用失败,因为 no method named `to_str` found for t
我正在尝试将原始操作系统文件名保存到存储中,因此我需要获取 OsStr 的原始字节。 似乎可以调用as_bytes()在 *nix 平台上,但未在 MS Windows 上定义。 是否有一种可移植的方
为什么调用这个函数: use std::string::ToString; use std::ffi::OsString; fn len(v: &T) -> usize { v.to_stri
我是一名优秀的程序员,十分优秀!