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>> 就好了