gpt4 book ai didi

arrays - 切片和数组有什么区别?

转载 作者:行者123 更新时间:2023-11-29 07:40:46 25 4
gpt4 key购买 nike

为什么 &[u8]&[u8; 3] 在这个例子中可以吗?

fn main() {
let x: &[u8] = &[1u8, 2, 3];
println!("{:?}", x);

let y: &[u8; 3] = &[1u8, 2, 3];
println!("{:?}", y);
}

The fact that &[T; n] can coerce to &[T] is the aspect that makes them tolerable. — Chris Morgan

为什么 &[T; n] 强制转换为 &[T]?在其他什么情况下会发生这种强制转换?

最佳答案

[T; n]是一个长度为n的数组,表示为n个相邻的T个实例。

&[T; n] 纯粹是对该数组的引用,表示为指向数据的瘦指针。

[T] 是一个切片,一个未定大小的类型;它只能通过某种形式的间接使用。

&[T],称为切片,是一种大小类型。它是一个胖指针,表示为指向第一项和切片长度的指针。

因此,数组的长度在编译时已知,而切片长度是运行时的事情。数组目前在 Rust 中是二等公民,因为不可能形成数组泛型。 [T; 的各种特征有手动实现; 0], [T; 1], &c.,通常最多 32 个;由于这个限制,切片更普遍有用。 &[T; n] 可以强制转换为 &[T] 是使它们可以容忍的方面。

[T; 有一个fmt::Debug 的实现; 3] 其中 T 实现了 Debug,另一个为 &T 其中 T 实现了 fmt::Debug,所以u8实现了Debug&[u8; 3] 也一样。

Why can &[T; n] coerce to &[T]? In Rust, when does coercion happen?

它会在需要时强制执行,而不会在其他时间强制执行。我可以想到两种情况:

  1. 某物需要 &[T] 而你给它一个 &[T; n] 它会默默地强制转换;
  2. 当您在 [T; 上调用 x.starts_with(...) 时; n] 它将观察到 [T; 上没有这样的方法; n],所以 autoref 开始发挥作用,它尝试 &[T; n],这没有帮助,然后强制开始发挥作用,它尝试 &[T],它有一个名为 starts_with 的方法。<

片段 [1, 2, 3].starts_with(&[1, 2]) 展示了两者。

关于arrays - 切片和数组有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30794235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com