< 返回版块

Snowmanzzz 发表于 2023-06-29 14:41

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?

评论区

写评论
griffenliu 2023-07-20 10:25

写错了,是 [T]

--
👇
griffenliu: str 和 [T} 切片本身是动态大小类型,加了个&,变量的类型就变成了切片的引用,编译器会把它转换成一个包含指针和长度的胖指针,存储在栈中,这个当然是已知大小的了。

griffenliu 2023-07-20 10:24

str 和 [T} 切片本身是动态大小类型,加了个&,变量的类型就变成了切片的引用,编译器会把它转换成一个包含指针和长度的胖指针,存储在栈中,这个当然是已知大小的了。

LongRiver 2023-06-29 16:52

slice是DST,具体说明参见 The Book 。 这里是用 str 为例介绍的,不过 slice 也是类似的。

我之前学习Rust的时候,画了几个图,可以参考下。

苦瓜小仔 2023-06-29 16:49

这里有一个语法糖:Index

container[index] is actually syntactic sugar for *container.index(index)

所以 nice_slice[i32],这是一个 DST,它没有实现 Sized,而

Note: variables, function parameters, const items, and static items must be Sized.

所以报错。

你可以问更多深入的问题,比如 if a[1..4] == [2, 3, 4] { 可以通过是为什么 :)

这又是一个语法糖 a == ba.eq(b) 的语法糖,具体说是 <A as PartialEq<B>>::eq(a, b),两个参数必须类型准确。 因为有 [B] as PartialEq<[A; N]>,所以它正确。

araraloren 2023-06-29 15:31

好好看文档 Slices are a view into a block of memory represented as a pointer and a length.

1 共 5 条评论, 1 页