Rust从入门到实战系列一百七十:自定义智能指针

本文介绍了如何在Rust中自定义类似Box的智能指针MyBox,并探讨了如何实现解引用功能以支持`*`运算符。作者通过示例展示了如何定义MyBox结构体和new函数,以及遇到的编译错误和解决方法(实现Dereftrait)。
摘要由CSDN通过智能技术生成

为了体会默认情况下智能指针与引用的不同,让我们创建一个类似于标准库提供的 Box 类型的智能
指针。接着学习如何增加使用解引用运算符的功能。
从根本上说,Box 被定义为包含一个元素的元组结构体,所以示例 15-8 以相同的方式定义了
MyBox 类型。我们还定义了 new 函数来对应定义于 Box 的 new 函数:
文件名: src∕main.rs
struct MyBox(T);
impl MyBox {
fn new(x: T) -> MyBox {
MyBox(x)
}
}

fn main() {}

示例 15-8:定义 MyBox 类型
这里定义了一个结构体 MyBox 并声明了一个泛型参数 T,因为我们希望其可以存放任何类型的值。
MyBox 是一个包含 T 类型元素的元组结构体。MyBox::new 函数获取一个 T 类型的参数并返回一个存放
传入值的 MyBox 实例。
尝试将示例 15-7 中的代码加入示例 15-8 中并修改 main 使用我们定义的 MyBox 类型代替 Box。
示例 15-9 中的代码不能编译,因为 Rust 不知道如何解引用 MyBox:
文件名: src∕main.rs

struct MyBox(T);

impl MyBox {

fn new(x: T) -> MyBox {

MyBox(x)

}

}

fn main() {
let x = 5;
let y = MyBox::new(x);
assert_eq!(5, x);
assert_eq!(5, *y);
}
示例 15-9:尝试以使用引用和 Box 相同的方式使用 MyBox
得到的编译错误是:
$ cargo run
Compiling deref-example v0.1.0 (file:///projects/deref-example)
error[E0614]: type MyBox<{integer}> cannot be dereferenced
–> src/main.rs:14:19
|
14 | assert_eq!(5, *y);
| ^^
For more information about this error, try rustc --explain E0614.
error: could not compile deref-example due to previous error
MyBox 类型不能解引用,因为我们尚未在该类型实现这个功能。为了启用 * 运算符的解引用功能,
需要实现 Deref trait。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值