- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习使用 Rust futures,但我发现它非常令人困惑。我觉得我很愚蠢但是什么时候使用then
,and_then
和or_else
?预期返回类型是什么?
请提供一些您希望看到的不同情况的示例。
最佳答案
TL;DR:then
用于无论 future 是否成功都想做某事,and_then
仅在未来成功时运行闭包,并且 or_else
仅在 future 失败时运行闭包。
and_then
和 or_else
是 Result
上同名方法的直接类比。
您的第一步应该是阅读文档。该文档包含确切的方法签名(解释它期望的类型和返回类型是什么)、描述每个方法的散文以及示例用法。
我提取了文档的小片段并强调了相关部分。
This function can be used to ensure a computation runs regardless ofthe conclusion of the future. The closure provided will be yielded a
Result
once the future is complete.The returned value of the closure must implement the
IntoFuture
traitand can represent some more work to be done before the composed futureis finished.
This function can be used to chain two futures together and ensurethat the final future isn't resolved until both have finished. Theclosure provided is yielded the successful result of this future andreturns another value which can be converted into a future.
Return a future that passes along this future's value if it succeeds, and otherwise passes the error to the closure
f
and waits for the future it returns.
所有三个方法的返回类型都是可以转换为另一个 future 的任何类型。
then
:对返回类型没有额外的限制。and_then
要求返回的 future 的错误类型与起始 future 的错误类型匹配。or_else
要求返回的 future 的成功类型与起始 future 的成功类型相匹配。use futures::{future, Future}; // 0.1.25
struct Error;
fn download_from_server(server: u8) -> impl Future<Item = Vec<u8>, Error = Error> {
/* ... */
}
fn upload_to_server(data: Vec<u8>) -> impl Future<Item = usize, Error = Error> {
/* ... */
}
// Uses `or_else` to do work on failure
fn download() -> impl Future<Item = Vec<u8>, Error = Error> {
download_from_server(0)
.or_else(|_| download_from_server(1))
.or_else(|_| download_from_server(2))
}
// Uses `and_then` to do work on success
fn reupload() -> impl Future<Item = usize, Error = Error> {
download().and_then(|data| upload_to_server(data))
}
// Uses `then` to always do work
fn do_things() -> impl Future<Item = (), Error = ()> {
reupload().then(|r| {
match r {
Ok(size) => println!("Uploaded {} bytes", size),
Err(_) => println!("Got an error"),
};
Ok(())
})
}
Rust 1.39 中稳定的 async
/await
语法简化了一些情况:
// Equivalent to `or_else`
async fn download() -> Result<Vec<u8>, Error> {
match download_from_server(0).await {
Ok(v) => Ok(v),
Err(_) => match download_from_server(1).await {
Ok(v) => Ok(v),
Err(_) => download_from_server(2).await,
},
}
}
// Equivalent to `and_then`
async fn reupload() -> Result<usize, Error> {
let data = download().await?;
upload_to_server(data).await
}
// Equivalent to `then`
async fn do_things() -> Result<(), ()> {
match reupload().await {
Ok(size) => println!("Uploaded {} bytes", size),
Err(_) => println!("Got an error"),
}
Ok(())
}
关于rust - Rust future 中的 `then` 、 `and_then` 和 `or_else` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55552413/
这个 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_
我是一名优秀的程序员,十分优秀!