- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了关于 Result
、From
、and_then
的一些我不理解的事情。
我的 impl Parser
中有这个函数,当没有足够的字节时,它会给我一个 byte slice 段或一个 ParseError
:
fn consume_bytes(self: &mut Parser<'a>, len: usize) -> Result<&[u8], ParseError> {
// ...
}
我正在尝试定义另一个函数:
fn read_utf8(self: &mut Parser<'a>, len: usize) -> Result<String, ParseError> {
self.consume_bytes(len)
.and_then(|bytes| String::from_utf8(bytes.to_vec()))
}
编译失败:
error[E0308]: mismatched types
--> src/parser.rs:147:31
|
147 | .and_then(|bytes| String::from_utf8(bytes.to_vec()))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `parser::ParseError`, found struct `std::string::FromUtf8Error`
|
= note: expected type `std::result::Result<_, parser::ParseError>`
found type `std::result::Result<std::string::String, std::string::FromUtf8Error>`
因为我已经定义了 From
的实现,所以我期望转换会自动执行,因为通过使用 try!
宏,转换是自动的(从什么我明白了):
impl From<FromUtf8Error> for ParseError {
fn from(err: FromUtf8Error) -> ParseError {
ParseError::InvalidConstantPoolEntry(err)
}
}
这是另一个失败的尝试,并显示相同的错误消息:
fn read_utf8(self: &mut Parser<'a>, len: usize) -> Result<String, ParseError> {
self.consume_bytes(len)
.and_then(|bytes| String::from_utf8(bytes.to_vec()))
.map_err(|e| From::from(e))
}
这个版本,其中 map_err
是 inside and_then
lambda,有效:
fn read_utf8(self: &mut Parser<'a>, len: usize) -> Result<String, ParseError> {
self.consume_bytes(len)
.and_then(|bytes| String::from_utf8(bytes.to_vec()).map_err(|e| From::from(e)))
}
为什么 and_then
没有像我预期的那样工作?
PS:更惯用的是:我在上面尝试编写的版本或使用 ?
运算符/try!
宏?
fn read_utf8(self: &mut Parser<'a>, len: usize) -> Result<String, ParseError> {
let bytes = self.consume_bytes(len)?;
Ok(String::from_utf8(bytes.to_vec())?)
}
最佳答案
I was expecting the conversion to be performed automatically, since by using the
try!
macro the conversion is automatic (from what I've understood).
但是你没有使用 try!
宏!
fn read_utf8(self: &mut Parser<'a>, len: usize) -> Result<String, ParseError> {
self.consume_bytes(len)
.and_then(|bytes| String::from_utf8(bytes.to_vec()))
}
幸运的是,您未调用的代码不会对您的代码产生任何影响。
检查 Result::and_then
的签名:
fn and_then<U, F>(self, op: F) -> Result<U, E>
where F: FnOnce(T) -> Result<U, E>
它需要一个返回 Result
的闭包,其错误类型与我们开始的相同。这里不会自动转换错误类型。 可能有一些成功类型的转换,这取决于闭包选择做什么。
这就是为什么在 and_then
中转换错误类型的版本有效,因为您已经将错误类型从 FromUtf8Error
转换为 ParseError
,使闭包返回的错误类型与 and_then
期望的相匹配。
关于rust - 为什么在使用 and_then 组合器时我的错误类型没有自动更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42330159/
这个 mysql 查询似乎对我不起作用: select * from myTable order by find_in_set( category, "First, Second" ), so
我有一个传递给 and_then 的函数,它返回编译器未知的类型。当与其他选项方法链接时,需要类型注释。 fn main() { let w = Some("hi".to_string());
我相信有一种方法可以“干净地”处理这个问题,我只是不太清楚。 use git2::Repository; // Prints out the current branch and sha if it
我相信有一种方法可以“干净地”处理这个问题,我只是不太清楚。 use git2::Repository; // Prints out the current branch and sha if it
我正在尝试拆分 this future/and-then chain一分为二,所以一部分可以隐藏在一个 crate 中,另一部分暴露在一个 API 中。 原始的工作代码: let future = w
我遇到了关于 Result、From、and_then 的一些我不理解的事情。 我的 impl Parser 中有这个函数,当没有足够的字节时,它会给我一个 byte slice 段或一个 Parse
我正在使用带有自定义验证器的clap,如下所示: .arg( Arg::with_name("config") .help("config.yml") .long(
Option::and_then 函数可以简化这段代码: let foo = Some(1); let bar = match foo { Some(i) => Some(i + 1),
这个问题在这里已经有了答案: How do I conditionally return different types of futures? (1 个回答) 关闭 3 年前。 在我的代码的这个简
在 Rust 中 Option类型有一个方法 and_then()定义为: pub fn and_then(self, f: F) -> Option where F: FnOnce(T) -
我有一些函数在失败时会返回不同的错误类型。 首先我有一个构建器,其中包含这个方法: #[derive(Debug)] pub enum BuilderError { ElementMissin
我有一个看起来像这样的函数: type Attributes = HashMap; type Store = Arc>>>; fn get(store: &Store, key: &str) -> O
为什么Option::and_then()不能仅从以下Option::unwrap_or()处理? and_then()仅在Option为Some()时才发生,然后.unwrap_or()仅在Opti
升级到 futures 0.3 后,我有这个错误: no method named `and_then` found for type `impl exchanges::kraken::failure
我正在学习使用 Rust futures,但我发现它非常令人困惑。我觉得我很愚蠢但是什么时候使用then,and_then和or_else?预期返回类型是什么? 请提供一些您希望看到的不同情况的示例。
这是我发现自己遇到的一个常见模式: let maybe_vec = Some(vec!["val"]); // I have an option with something in it maybe_
我是一名优秀的程序员,十分优秀!