fn main() {
let a = [1, 2, 3, 4, 5];
let nice_slice = a[1..4];
if nice_slice == [2, 3, 4] {
println!("Nice slice!");
} else {
println!("Not quite what I was expecting... I see: {:?}", nice_slice);
}
}
the size for values of type [{integer}]
cannot be known at compilation time [E0277]
为什么这行加个&就好了
加了类型就多了个&,难道这类型size就可以known at compilation time?
1
共 5 条评论, 1 页
评论区
写评论写错了,是 [T]
--
👇
griffenliu: str 和 [T} 切片本身是动态大小类型,加了个&,变量的类型就变成了切片的引用,编译器会把它转换成一个包含指针和长度的胖指针,存储在栈中,这个当然是已知大小的了。
str 和 [T} 切片本身是动态大小类型,加了个&,变量的类型就变成了切片的引用,编译器会把它转换成一个包含指针和长度的胖指针,存储在栈中,这个当然是已知大小的了。
slice是DST,具体说明参见 The Book 。 这里是用 str 为例介绍的,不过 slice 也是类似的。
我之前学习Rust的时候,画了几个图,可以参考下。
这里有一个语法糖:Index
所以
nice_slice
是[i32]
,这是一个 DST,它没有实现 Sized,而所以报错。
你可以问更多深入的问题,比如
if a[1..4] == [2, 3, 4] {
可以通过是为什么 :)这又是一个语法糖
a == b
是a.eq(b)
的语法糖,具体说是<A as PartialEq<B>>::eq(a, b)
,两个参数必须类型准确。 因为有[B] as PartialEq<[A; N]>
,所以它正确。好好看文档
Slices are a view into a block of memory represented as a pointer and a length.