【问题标题】:How does Rust determine the length of a slice when unsizing from an array?从数组中取消大小时,Rust 如何确定切片的长度?
【发布时间】: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 如何知道长度字段?

【问题讨论】:

    标签: arrays rust slice


    【解决方案1】:

    数组确实有一个长度“参数”。它不是一个字段,它是类型的一部分:

    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 长,从xy 的分配失败。

    当对数组执行某些操作时,编译器对数组有特殊的内置语义。这些内置语义可以利用长度“参数”([T; N] 中的N)。您可以使用 const 泛型在类型级别操作和访问此值,但现在这是一个仅夜间功能。

    【讨论】:

      【解决方案2】:

      使用.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

      【讨论】:

      • 数组没有像 Vec 这样的长度参数。 Rust 转换成 slice 时如何知道数组的长度?
      • 问题是“我知道slice_arr.len()可以得到切片的长度”
      猜你喜欢
      • 1970-01-01
      • 2020-02-22
      • 2015-05-07
      • 2014-10-15
      • 2017-05-20
      • 2022-01-28
      • 2015-02-23
      • 2017-07-20
      • 2016-05-16
      相关资源
      最近更新 更多