问题描述
为什么此代码编译:
pub fn main() {
let my_vec = vec!["b","c","d"];
let res = ["a"].iter()
.chain(my_vec.iter().map(|s| s))
.collect::<Vec<_>>();
println!("{:?}",res)
}
这不是:
pub fn main() {
let my_vec = vec![(1,"b"),(2,"c"),(3,"d")];
let res = ["a"].iter()
.chain(my_vec.iter().map(|s| s.1))
.collect::<Vec<_>>();
println!("{:?}",res)
}
有没有办法使其编译?
背景
我正在尝试通过向其添加元素来重构构建矢量的代码。看起来像这样:
pub fn main() {
let my_vec = vec![(1,"d")];
let mut res = Vec::new();
res.push("a");
for (_,s) in &my_vec {
res.push(s);
}
println!("{:?}",res)
}
我将其更改为可以从迭代器链中收集此向量的东西,而无需修改适当的可变实例:
pub fn main() {
let my_vec = vec![(1,res)
}
我想到的构造无法编译:
error[E0271]: type mismatch resolving `<[closure@iter.rs:5:34: 5:41] as std::ops::FnOnce<(&({integer},&str),)>>::Output == &&str`
--> iter.rs:5:10
|
5 | .chain(my_vec.iter().map(|s| s.1))
| ^^^^^ expected `str`,found `&str`
|
= note: expected reference `&str`
found reference `&&str`
= note: required because of the requirements on the impl of `std::iter::Iterator` for `std::iter::Map<std::slice::Iter<'_,({integer},&str)>,[closure@iter.rs:5:34: 5:41]>`
error[E0599]: no method named `collect` found for struct `std::iter::Chain<std::slice::Iter<'_,&str>,std::iter::Map<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>` in the current scope
--> iter.rs:6:10
|
6 | .collect::<Vec<_>>();
| ^^^^^^^ method not found in `std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>`
|
= note: the method `collect` exists but the following trait bounds were not satisfied:
`<std::iter::Map<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]> as std::iter::Iterator>::Item = &&str`
which is required by `std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>: std::iter::Iterator`
`std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>: std::iter::Iterator`
which is required by `&mut std::iter::Chain<std::slice::Iter<'_,[closure@iter.rs:5:34: 5:41]>>: std::iter::Iterator`
我尝试到处添加和删除&
标志,但没有任何帮助。我还尝试了一个更简单的变体:
pub fn main() {
let my_vec = vec!["b",res)
}
这对我来说似乎并没有什么不同,但是编译器对此没有任何问题。
在我最初的问题中,结果不是Vec<&str>
而是Vec<&T>
,其中T
是其他结构,但是我简化了示例,错误消息非常多相同。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)