在 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()
的问题。
(注意:我正在尝试实现我自己的动态大小类型,该类型包装切片和其他一些字段,并且我希望使包装数组的等效类型继承我的动态大小类型的方法。)
你很接近:重要的特质是
Deref
,而不是Borrow
:
https://doc.rust-lang.org/std/ops/trait.Deref.html#more-on-deref-coercion
如果
实现T
,并且Deref<Target = U>
是x
类型的值,则:T
- 在不可变的上下文中,
(其中*x
*Deref::deref(&x)`。T is neither a reference nor a raw pointer) is equivalent to
- 类型的值
类型的值被强制转换为&T
&U
隐式实现T
类型的所有(不可变)方法。U
您可以在那里找到包含更多详细信息的其他链接。