首页 > 其他分享 >无涯教程-Rust - 智能指针

无涯教程-Rust - 智能指针

时间:2024-01-25 21:31:28浏览次数:23  
标签:Box 教程 MyBox 无涯 fn new println Deref Rust

Rust默认情况下在堆栈上分配所有内容,您可以通过将它们包装在智能指针(如 Box )中来将它们存储在堆上,智能指针实现下表中列出的特征 -

Sr.No Trait name Package & 描述
1 Deref

std::ops::Deref

用于不可变的取消引用操作,如* v。

2 Drop

std::ops::Drop

当值超出范围时用于运行一些代码,有时称为析构函数

在本章中,我们将学习 Box 智能指针,我们还将学习如何创建自定义的智能指针(如Box)。

Box智能指针使您可以将数据存储在堆而不是堆栈上,堆栈包含指向堆数据的指针, Box除了将其数据存储在堆上之外,没有性能开销。

让我们看看如何使用盒子在堆上存储i32值。

fn main() {
   let var_i32=5; 
   //stack
   let b=Box::new(var_i32); 
   //heap
   println!("b={}", b);
}
b=5

为了访问变量所指向的值,请使用解引用。 *用作取消引用运算符,让我们看看如何对Box使用取消引用。

fn main() {
   let x=5; 
   //值类型变量
   let y=Box::new(x); 
   //y 指向堆中的新值 5

   println!("{}",5==x);
   println!("{}",5==*y); 
   //取消引用 y
}

变量x是值为5的值类型,因此,表达式 5 == x 将返回true,变量y指向堆,要访问堆中的值,我们需要使用 * y解除引用, * y 返回值5,因此,表达式 5 == * y 返回true。

true
true

Deref特性

标准库提供的Deref特性要求我们实现一种名为 deref 的方法,该方法借用 self 并返回对内部数据的引用,下面的示例创建一个结构 MyBox ,它是一种通用类型,它实现了特征 Deref ,此特征有助于我们使用 * y 访问由 y 包裹的堆值。

use std::ops::Deref;
struct MyBox<T>(T);
impl<T> MyBox<T> { 
   //具有静态方法的通用结构 new
   fn new(x:T)-> MyBox<T> {
      MyBox(x)
   }
}
impl<T> Deref for MyBox<T> {
   type Target=T;
   fn deref(&self) -> &T {
      &self.0 //返回数据
   }
}
fn main() {
   let x=5;
   let y=MyBox::new(x); 
   //调用静态方法
   
   println!("5==x is {}",5==x);
   println!("5==*y is {}",5==*y); 
   //dereferencing y
   println!("x==*y is {}",x==*y);
   //dereferencing y
}
5==x is true
5==*y is true
x==*y is true

Drop特性

Drop特性包含 drop()方法,当实现此特征的结构超出范围时,将调用此方法,在某些语言中,程序员每次使用智能指针完成操作时,都必须调用代码以释放内存或资源。在Rust中,您可以使用Drop trait实现自动内存释放。

use std::ops::Deref;

struct MyBox<T>(T);
impl<T> MyBox<T> {
   fn new(x:T)->MyBox<T>{
      MyBox(x)
   }
}
impl<T> Deref for MyBox<T> {
   type Target=T;
      fn deref(&self) -< &T {
      &self.0
   }
}
impl<T> Drop for MyBox<T>{
   fn drop(&mut self){
      println!("dropping MyBox object from memory ");
   }
}
fn main() {
   let x=50;
   MyBox::new(x);
   MyBox::new("Hello");
}

在上面的示例中,当我们在堆中创建两个对象 时,drop方法将被调用两次。

dropping MyBox object from memory
dropping MyBox object from memory

参考链接

https://www.learnfk.com/rust/rust-smart-pointers.html

标签:Box,教程,MyBox,无涯,fn,new,println,Deref,Rust
From: https://blog.51cto.com/u_14033984/9420055

相关文章

  • C++教程——初识C++(运算符)
    前一节我们初步认识出c++是一门面向对象的程序设计语言,并且我们初步认识了变量,数据类型,常量,输入输出以及合法的标识符命名规则,接下来我们要学习的是运算符。在c++中有逻辑运算符,赋值运算符,算数运算符,位运算符,关系运算符和杂项运算符。先从简单的算数运算符开始讲起,算数运算符简单来......
  • 无涯教程-Rust - 迭代&闭包
    在本章中,我们将学习RUST中的迭代器和闭包如何工作。Iterator迭代器迭代器有助于迭代值的集合,例如数组,向量,Map映射等,迭代器实现Rust标准库中定义的Iteratortrait,iter()方法返回集合的迭代器对象,迭代器对象中的值称为元素,迭代器的next()方法可用于遍历元素,当到达集合末尾时,next......
  • 无涯教程-Rust - 文件输入&输出
    除了对控制台进行读写之外,Rust还允许对文件进行读写,File结构代表一个文件,它允许程序对文件执行读写操作,File结构中的所有方法均返回io::Result枚举的变体。写入文件以下程序创建文件"data.txt",create()方法用于创建文件,如果文件创建成功,该方法将返回文件句柄,最后一行write_a......
  • 【完整版教程】iOS混淆加固原理篇
    引言在iOS开发中,应用程序的安全性和保护显得尤为重要。由于iOS系统的开放性,一些逆向工具可以轻松地对应用程序进行反编译和分析,从而导致应用程序源代码、算法和敏感信息的泄露。为了保护应用程序的安全性,我们需要对应用程序进行混淆加固。本文将介绍iOS混淆加固的原理和常见的加......
  • 无涯教程-Rust - 输入&输出
    本章讨论如何接受来自标准输入Input的值以及如何将值显示到标准输出Output,在本章中,我们还将讨论传递命令行参数。读和写Rust的input和output标准库函数围绕两个特征进行组织-Read读Write写Sr.NoTrait&描述Example1Read- 实现Read的类型具有面向字节输入的方法。S......
  • Spring的事务使用教程
    什么是事务?事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败。事务四个特性(ACID)原子性一组操作要么都成功,要么都失败。一致性一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。隔离性事务1......
  • 25从零开始用Rust编写nginx,序列化之serde是如何工作的
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy序......
  • 无涯教程-Rust - 错误处理
    在Rust中,错误可以分为两大类,如下表所示。Name&描述UsageRecoverable可恢复的错误ResultenumUnRecoverable无法恢复的错误panicmacro与其他编程语言不同,Rust没有Exception异常,它返回可恢复错误的枚举Result<T,E>,如果程序遇到不可恢复的错误,则调用panic宏。Panic......
  • Rust 一个 I/O 项目:构建一个命令行程序
    本篇在原文基础上有删减和添加,增加了一些细节内容,原文请参考一个I/O项目:构建一个命令行程序。目录接受命令行参数读取参数值将参数值保存进变量读取文件重构改进模块性和错误处理二进制项目的关注分离提取参数解析器组合配置值使用clone的权衡取舍创建一个Config的构造函数......
  • 【精品教程】如何查看iOS崩溃日志
    简介当一个应用程序崩溃,会产生一个崩溃报告(crashreport),并存储到设备中。崩溃报告描述了应用程序崩溃的条件,通常包含每个执行线程的完整回溯。查看崩溃报告可以帮助我们了解应用程序的崩溃情况,并尝试修复问题。符号化崩溃报告崩溃报告需要进行符号化(symbolicated),才能够进行分析......