gpt4 book ai didi

Rust - 特征 `StdError` 没有为 `OsString` 实现

转载 作者:行者123 更新时间:2023-12-04 12:15:47 31 4
gpt4 key购买 nike

我正在编写一些使用 ? 的 Rust 代码运算符(operator)。这是该代码的几行:

fn files() -> Result<Vec<std::string::String>, Box<Error>> {

let mut file_paths: Vec<std::string::String> = Vec::new();
...
file_paths.push(pathbuf.path().into_os_string().into_string()?);
...
Ok(file_paths)
}
但是,即使我使用的是 ?Result它给了我以下错误:
`the trait `StdError` is not implemented for `OsString`.
这与 Rust 文档 here 相悖,其中指出: The ? is shorthand for the entire match statements we wrote earlier. In other words, ? applies to a Result value, and if it was an Ok, it unwraps it and gives the inner value. If it was an Err, it returns from the function you're currently in.我已经确认 pathbuf.path().into_os_string().into_string() 的类型是 Result ,因为当我删除 ? ,我收到以下编译器错误:
expected struct `std::string::String`, found enum `std::result::Result`
(因为 file_paths 是字符串向量,而不是结果)。
这是 Rust 语言或文档的错误吗?
事实上,我在没有推送到 Vector 的情况下尝试了这个,只是简单地用 pathbuf.path().into_os_string().into_string()? 的值初始化了一个变量。 ,我得到了同样的错误。

最佳答案

函数OsString::into_string有点不寻常。它返回一个 Result<String, OsString> - 所以 Err变体实际上不是错误。
如果OsString不能转换成正则字符串,则Err返回变体,包含原始字符串。
不幸的是,这意味着您不能使用 ?直接运算符(operator)。但是,您可以使用 map_err将错误变量映射为实际错误,如下所示:

file_paths.push(
pathbuf.path()
.into_os_string()
.into_string().
.map_err(|e| InvalidPathError::new(e))?
);
在上面的例子中, InvalidPathError可能是您自己的错误类型。您还可以使用 std 库中的错误类型。

关于Rust - 特征 `StdError` 没有为 `OsString` 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67204725/

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