Rust中(Option<&str>,Option<&str>)如何转Option<String>元组?
问题原因
编译报错的核心原因如下:
map是Iterator(迭代器)trait的内置方法,仅支持实现了迭代器特征的类型调用- Rust中元组是固定长度的异构集合,本身没有实现迭代器特征,也没有提供内置的全元素映射方法,直接在元组上调用
map时,编译器会判定你在尝试把元组当迭代器使用,最终抛出类型不匹配错误。
解决方法
Rust 1.61及以上版本不需要任何额外依赖,直接对元组的每个元素单独做转换即可,这也是零开销、符合Rust编码习惯的写法:
写法1:直接通过元组下标转换
let c: (Option<&str>, Option<&str>) = (Some("bar"), Some("baz")); let d: (Option<String>, Option<String>) = ( c.0.map(str::to_string), c.1.map(str::to_string) );
这里可以直接传入函数指针str::to_string替代手写闭包,写法更简洁,和你实现单个可选字符串切片转换的逻辑完全一致。
写法2:先解构元组再转换
如果觉得下标语义不够清晰,可以先把元组解构为独立变量再处理:
let c: (Option<&str>, Option<&str>) = (Some("bar"), Some("baz")); let (s1, s2) = c; let d: (Option<String>, Option<String>) = ( s1.map(|s| s.to_string()), s2.map(|s| s.to_string()) );
提示:如果是长度更长的元组(3元、4元组等),上述下标访问/解构的写法依然通用,不存在版本兼容问题。
内容的提问来源于stack exchange,提问作者Mihai Galos
相关产品推荐
相关产品推荐

