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

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

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

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

新手求助

1604 次点击
所在节点    Rust
24 条回复
hsfzxjy
2022-06-30 15:29:08 +08:00
x.map(|(a, b)| b)
timothyye
2022-07-02 13:31:26 +08:00
(String, String) 就是个 tuple 类型
ecloud
2022-07-06 17:43:16 +08:00
@hsfzxjy 实际测试了一下这种写法似乎不行,因为(a,b)不是一定存在的,它可能会是 None ,这样写 map 就晕了。似乎除了手写 match 没有啥太好的现成方法
hsfzxjy
2022-07-06 17:50:25 +08:00
.map 就是它非 None 时才会执行啊,怎么不对了
ecloud
2022-07-06 17:56:18 +08:00
@hsfzxjy 类型不对,写成(a, b)的话,map 会要求输入类型为 tuple ,而万一前面函数返回 None 他就报类型转换错误
ecloud
2022-07-06 17:59:13 +08:00
@hsfzxjy 就是说这个该死的函数返回的是 None ,或者(String String),而不是(Option, Option);如果是后者用 map 很舒服的
hsfzxjy
2022-07-06 18:00:57 +08:00
None 是 Option<_>的一个值啊

let x : Option<(String,String)>=None;
x.map(|(a,b)|b);

这样是没问题的。或者你能不能给一个行不通的例子?
hsfzxjy
2022-07-06 18:02:32 +08:00
None 不是类型,是 Option<_>类型的一个值
ecloud
2022-07-06 18:07:14 +08:00
@hsfzxjy con.brpop::<&str, Option<(String, String)>>("ttt", 1).map(|a| a.1)报错 error[E0609]: no field `1` on type `Option<(String, String)>`
con.brpop::<&str, Option<(String, String)>>("ttt", 1).map(|(a, b)| b)报错 error[E0308]: mismatched types
ecloud
2022-07-06 18:09:11 +08:00
@hsfzxjy
= note: expected enum `Option<(String, String)>`
found tuple `(_, _)`
hsfzxjy
2022-07-06 18:10:32 +08:00
因为 brpop 返回的是 RedisResult<Option<(String, String)>>,你要这样
return Ok(con.brpop("ttt", 1)?.map(|a| a.1));
ecloud
2022-07-06 18:10:45 +08:00
我感觉编译器认为(_,_)就不是 Option<(String, String)>,这不知道是出于什么考虑还是难道说是一个 bug ?
hsfzxjy
2022-07-06 18:11:53 +08:00
要注意看函数返回的类型
ecloud
2022-07-06 18:13:12 +08:00
@hsfzxjy a.1 这种写法是有可能的,但是(a,b)这种写法看起来怎么都弄不过去
hsfzxjy
2022-07-06 18:14:59 +08:00
return Ok(con.brpop("ttt", 1)?.map(|(a,b)| b));

也是可以的,你试试
ecloud
2022-07-06 18:18:03 +08:00
@hsfzxjy Ok 的写法是不可以的,因为我要返回的是 Option<String>而不是 String ,我还得要处理下 None 的情况。也就是说 None 转 None ,非 None 转 a.1 。而且还要抛错误
hsfzxjy
2022-07-06 18:21:35 +08:00
@ecloud 我 15 楼返回的就是 RedisResult<Option<String>>,就是你想要的
hsfzxjy
2022-07-06 18:22:54 +08:00
可能需要加类型指引

return Ok(con.brpop::<&str, Option<(String, String)>>("ttt", 1)?.map(|(a,b)| b));
ecloud
2022-07-06 18:36:45 +08:00
@hsfzxjy 都不行的,我感觉 map(a,b)它想要的是(Option, Option)而不收 Option<(T, T)>
hsfzxjy
2022-07-06 18:39:25 +08:00
你尝试了吗,不要感觉,不妨试试

map 是可以作用于 Option<(String, String)>

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

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

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

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

© 2021 V2EX