当从数组中解除大小时,Rust如何确定一个slice的长度?

问题描述 投票:-1回答:1

我知道一个分片就像一个fatptr。(data_ptr, len). 当我把一个数组分片成一个slice时。

let arr = [0; 10];
let slice_arr = &arr[..];

一个数组没有长度字段,就像... Vec<T>.

我知道 slice_arr.len() 可以得到切片的长度,因为 slice_arr 有一个长度字段。当一个数组被转换为一个分片时,Rust如何知道长度字段?

arrays rust slice
1个回答
2
投票

一个数组 是否 有一个长度的 "参数"。它不是一个字段,它是类型的一部分。

let x: [u8; 2] = [1, 2];
let y: [u8; 3] = x; // Error here

The type of x[u8; 2]. 元素的数量是 始终 2,元素的类型是 始终 u8.

因为 [u8; 2][u8; 3] 是不同的类型,一个是 始终 正好2 u8的长,另一个是 始终 正好3 u8的长,任务从 x 变成 y 失败。

当对数组进行某些操作时,编译器对数组有特殊的内置语义。这些内置语义可以利用长度 "参数"(The N[T; N]). 您可以在类型级别上访问这个值,使用 const 属,但这是一个晚上才有的功能,现在。


0
投票

使用 .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.orgstablerust by-exampleprimitivesarray.html。

© www.soinside.com 2019 - 2024. All rights reserved.