Option<(String, String)>怎么转成 Option<String>

2022-06-30 15:24:12 +08:00
 ecloud

一个库函数返回 Option<(String, String)>

我做了个函数把它包起来,想给上级返回第二个值的 Option<String>,该怎么写?

新手求助

1626 次点击
所在节点    Rust
24 条回复
ecloud
2022-07-06 18:40:21 +08:00
@hsfzxjy
= note: expected enum `Option<(String, String)>`
found tuple `(_, _)`
hsfzxjy
2022-07-06 18:40:49 +08:00
就是直接把 18 楼的方案替换到你附言的代码中
hsfzxjy
2022-07-06 18:52:49 +08:00
fn do_redis(con: &mut redis::Connection) -> RedisResult<Option<String>> {
Ok(con
.brpop::<_, Option<(String, String)>>("ttt", 1)?
.map(|(a, b)| b))
}

写成这样就可以了
hsfzxjy
2022-07-06 19:01:38 +08:00
我来给你分析一下

首先 con.brpop::<_, Option<(String, String)>>("ttt", 1) 返回的是 RedisResult<Option<(String, String)>>,他有几个可能值

1. Err(_) 发生了错误
2. Ok(None) 正常返回了,但是内容为空
3. Ok((str1, str2)) 正常返回了非空内容

接下来的 ? 操作符会把 RedisResult<Option<(String, String)>> 变为 Option<(String, String)。如果是第一种情况,则这里会提前把错误抛出去,否则,提取出来的 Option<(String, String)> 会继续下面的变换

然后你要知道,对于一个类型为 Option<U> 的值 x ,以及一个变换函数 f: Fn(U) -> T ,x.map(f) 会变成一个 Option<T> 类型的值。

带入到你的场景就是 U = (String, String), T = String, 变换函数 |(a,b)| b 的类型是 Fn((String,String) -> String 。

所以 .map(|(a,b)|b) 会接着把 Option<(String, String)> 变成 Option<String>。

最后,你的函数想要一个 RedisResult<Option<String>> 的返回值,那只需使用 Ok() 把 Option<String> 变成 RedisResult<Option<String>> 就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863217

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX