rust - 我可以从自定义类型中借用切片吗?
问题描述
可以将 a 借入Vec<u32>
a&Vec<u32>
或 a &[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
}
解决方案
您正在寻找std::ops::Deref
:
除了用于
*
在不可变上下文中使用(一元)运算符进行显式取消引用操作外,Deref
编译器在许多情况下也隐式使用。这种机制称为“Deref
强制”。在可变上下文中,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;
}
推荐阅读
- java - 为什么相同的 Comparator 在单元测试中的行为与作为 Web 应用程序运行时的行为不同?
- google-apps-script - 用于删除包含部分关键字的行的 Google Apps 脚本
- wpf - 尝试通过 CefSharp.ChromiumWebBrowser 将 XAML 绑定到 VM 似乎在 WPF 中不起作用
- c# - 如何在 IFrame 中打开 Pdf 文件?
- windows - 使用 windows 命令行检索所有用户的 HOMEPATH
- docker - 运行到 docker 时实例总是关闭
- c++ - 在c ++中的二维数组中取出一个数字
- mongodb - Mongodb将集合用作循环的最佳方法是什么
- python - 获取numpy数组中的行,其中列包含字符串
- ruby-on-rails - 如何在 Rails 中创建具有 NULLS LAST 的索引?