在下面的代码中我收到错误:
error[E0277]: the size for values of type `[{integer}]` cannot be
known at compilation time at the line `for n in numbers[1..] {`
Run Code Online (Sandbox Code Playgroud)
我四处搜寻,但一无所获。
fn main() {
let mut numbers = Vec::new();
numbers.push(1);
numbers.push(32);
numbers.push(43);
numbers.push(42);
// ... And many more
println!("{:?}", numbers); // Sanity
let mut sum = 0;
// Problem code area
for n in numbers[1..] {
sum = sum + n;
}
// Problem code area
println!("{}", sum);
}
Run Code Online (Sandbox Code Playgroud)
&另外,如果我将它们替换为以下内容(添加和*用于所有权/借用和取消引用),问题行就会起作用
for n in &numbers[1..] {
sum = sum + *n;
}
Run Code Online (Sandbox Code Playgroud)
为什么按照前面的方式编译失败?
numbers[1..]没有大小,因为它是 的裸\xc2\ xb9切片numbers。切片只能用在某种指针后面,例如&[T]、Box<[T]>、 或Arc<[T]>。以下问题提供了有关切片的更多信息:
因为它没有大小,[T]所以无法实现IntoIterator,这是用于在循环中迭代事物的特征for。(请参阅为什么我可以迭代切片两次,但不能迭代向量?)IntoIterator::into_iter具有以下原型:
fn into_iter(self) -> Self::IntoIter;\nRun Code Online (Sandbox Code Playgroud)\n\nSelf不能是未调整大小的类型,因为按值into_iter获取。self
&numbers[1..]是一个引用(类型&[T]),它既有大小又有实现IntoIterator,所以它工作得很好。
完整的编译器输出还给出了有关 的错误消息IntoIterator,并建议使用numbers[1..].iter()它。因为.iter()需要&self,它可以在未调整大小的类型上调用,所以这是解决问题的另一种方法。
\xc2\xb9在很多地方,包括官方文档,都使用非限定术语“切片”来指代引用类型&[T]。我称其为裸numbers[1..]切片,因为它不是引用;它的类型只是.[T]
| 归档时间: |
|
| 查看次数: |
6872 次 |
| 最近记录: |