为什么数组会自动转换为切片?

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

在 Rust 中,切片类型

[T]
有很多有用的方法,例如
.last()
。但是,数组类型
[T; N]
上不存在等效方法,但仍然可以从数组对象调用这些切片方法。

例如:

pub fn main() {
    let arr: [u32; 4] = [1, 2, 3, 4];
    let slice: &[u32] = &arr;

    // last() is a method of the (unsized) slice type, so this is fine
    println!("Slice len: {}", slice.last().unwrap());

    // This works, but how?
    println!("Array len: {}", arr.last().unwrap());
}

数组类型如何自动继承切片类型的方法?对于自定义类型可以这样做吗?

我怀疑这与

[T; N]
实现
Borrow<[T]>
有关,但这并不能回答为什么我们不需要写
arr.borrow().last()
的问题。

(注意:我正在尝试实现我自己的动态大小类型,该类型包装切片和其他一些字段,并且我希望使包装数组的等效类型继承我的动态大小类型的方法。)

arrays rust type-conversion slice borrow
1个回答
0
投票

你很接近:重要的特质是

Deref
,而不是
Borrow

https://doc.rust-lang.org/std/ops/trait.Deref.html#more-on-deref-coercion

如果

T
实现
Deref<Target = U>
,并且
x
T
类型的值,则:

  • 在不可变的上下文中,
    *x
    (其中
    T is neither a reference nor a raw pointer) is equivalent to 
    *Deref::deref(&x)`。
  • &T
    类型的值被强制转换为
    &U
  • 类型的值
  • T
    隐式实现
    U
    类型的所有(不可变)方法。

您可以在那里找到包含更多详细信息的其他链接。

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