可以将Vec<u32>
借入&Vec<u32>
或&[u32]
中。我认为这归功于AsRef
或Borrow
特质。但是,我无法在自己的自定义类型上实现此类借用。我在这里树错树了吗?
use std::borrow::Borrow;
struct MyArray([u32; 5]);
impl MyArray {
fn new() -> MyArray {
MyArray([42; 5])
}
}
impl AsRef<[u32]> for MyArray {
fn as_ref(&self) -> &[u32] {
&self.0
}
}
impl Borrow<[u32]> for MyArray {
fn borrow(&self) -> &[u32] {
&self.0
}
}
fn main() {
let ma = MyArray::new();
let _: &[u32] = &ma; // compilation failure
}
答案 0 :(得分:3)
您正在寻找std::ops::Deref
:
除了在不可改变的上下文中使用{一元)
*
运算符进行显式解引用操作之外,Deref
在许多情况下还被编译器隐式使用。该机制称为'Deref
coercion'。在可变上下文中,使用DerefMut
。
修改后的代码:
use std::ops::Deref;
struct MyArray([u32; 5]);
impl MyArray {
fn new() -> MyArray {
MyArray([42; 5])
}
}
impl Deref for MyArray {
type Target = [u32];
fn deref(&self) -> &[u32] {
&self.0
}
}
fn main() {
let ma = MyArray::new();
let _: &[u32] = &ma;
}