【发布时间】:2020-08-15 12:21:00
【问题描述】:
我知道切片就像一个 fatptr:(data_ptr, len)。当我将数组切片成切片时:
let arr = [0; 10];
let slice_arr = &arr[..];
数组没有像Vec<T> 这样的长度字段。
我知道slice_arr.len() 可以得到切片的长度,因为slice_arr 有一个长度字段。当数组转换为切片时,Rust 如何知道长度字段?
【问题讨论】:
我知道切片就像一个 fatptr:(data_ptr, len)。当我将数组切片成切片时:
let arr = [0; 10];
let slice_arr = &arr[..];
数组没有像Vec<T> 这样的长度字段。
我知道slice_arr.len() 可以得到切片的长度,因为slice_arr 有一个长度字段。当数组转换为切片时,Rust 如何知道长度字段?
【问题讨论】:
数组确实有一个长度“参数”。它不是一个字段,它是类型的一部分:
let x: [u8; 2] = [1, 2];
let y: [u8; 3] = x; // Error here
x 的类型是[u8; 2]。元素个数always 2,元素类型always u8.
因为[u8; 2] 和[u8; 3] 是不同的类型,所以一个总是 正好2 u8s 长,另一个总是 正好3 u8 s 长,从x 到y 的分配失败。
当对数组执行某些操作时,编译器对数组有特殊的内置语义。这些内置语义可以利用长度“参数”([T; N] 中的N)。您可以使用 const 泛型在类型级别操作和访问此值,但现在这是一个仅夜间功能。
【讨论】:
使用.len 方法。
use std::io::stdin;
fn main() {
let arr = [0; 10];
let slice_arr = &arr[..];
println!("first element of the slice: {}", slice_arr[0]);
println!("the slice has {} elements", slice_arr.len());
}
https://doc.rust-lang.org/stable/rust-by-example/primitives/array.html
【讨论】:
slice_arr.len()可以得到切片的长度”