Rust方法自动解引用测试,总结和补充
// 定义一个结构体MyBox,包含一个原始指针
struct MyBox<T>(T);// 方法调用 . 操作,对方法的self 进行加& &mut * 还有 无大小转换
trait MyTrait {fn test0(mut self, x: &i32) where Self: Sized {println!("test0 :{}", x);}fn test1(self, x: &i32) where Self: Sized {println!("test1: {}", x);}fn test2(&self, x: &i32) where Self: Sized {println!("test2: {}", x);}fn test3(&mut self, x: &i32) where Self: Sized {println!("test3: {}", x);}
}impl<T> MyBox<T> {fn new(x: T) -> MyBox<T> {MyBox(x)}fn test(self: Arc<Self>) {println!("test type self");}
}impl<T> MyTrait for MyBox<T> {}use std::ops::{Deref, DerefMut};
use std::sync::Arc;impl<T> Deref for MyBox<T> {type Target = T;fn deref(&self) -> &Self::Target {println!("deref run.");&self.0}
}impl<T> DerefMut for MyBox<T> {fn deref_mut(&mut self) -> &mut Self::Target {println!("deref mut run .");&mut self.0}
}fn f0(b: MyBox<[i32; 2]>) {println!("succ f0.")
}fn f1(b: &MyBox<[i32; 2]>) {println!("succ f1.")
}fn f2(b: &mut MyBox<[i32; 2]>) {println!("succ f2.")
}fn f3(b: [i32; 2]) {println!("succ f3.")
}fn f4(b: &[i32; 2]) {println!("succ f4.")
}fn f5(b: &mut [i32; 2]) {println!("succ f5.")
}//无法写出 大小在编译未知
// // // fn f6(b: [i32]){
// // println!("succ")
// }
fn f7(b: &[i32]) {println!("succ f7.")
}fn f8(b: &mut [i32]) {println!("succ f8.")
}trait ArrTrait {fn arr_f0(mut self) where Self: Sized {println!("test arr_f0.");}fn arr_f1(self) where Self: Sized {println!("test arr_f1.");}fn arr_f2(&mut self) where Self: Sized {println!("test arr_f2.");}fn arr_f3(&self) where Self: Sized {println!("test arr_f3.");}
}trait UnsizeArrTrait {// 该处方法无法使用。因为[i32] 大小未知 无法通过编译// fn u_arr_f0(mut self: Self){// println!("u_arr_f0");// }// fn u_arr_f1(self){// println!("u_arr_f1");// }fn u_arr_f2(&mut self) {println!("u_arr_f2");}fn u_arr_f3(&self) {println!("u_arr_f3");}
}impl ArrTrait for [i32; 2] {}impl UnsizeArrTrait for [i32] {}#[test]
fn t() {let my_box = MyBox([3; 2]);// my_box.test();// 方法测试 自动添加&,* 减少工作量 mut 不属于类型一部分,只是修饰// my_box.test0(&3); 隐式转换.deref deref_mut &strMyTrait::test2(&my_box,&4);// my_box.test1(&3);// my_box.test2(&4); //自动给添加 &// my_box.test3(&3); //自动添加 &// (&my_box).test0(&3); // 自动加* 调用self// (&my_box).test1(&3); // 自动加 *// &my_box.test2(&3); //自动 归一化 一直到 只有一个 & .然后test2的&self ,然后直接调用。如果是// (&&&&&&&&&&&my_box).test3(&3); //归一化 变成&my_box 然后直接调用方法
// -------------------------------------------------------------------------------
// my_box.arr_f0();// 调用了my_box的deref ,然后进行了添加* 调用了arr_f0方法,
// ArrTrait::arr_f0(*my_box)// 感觉&[i32;2]能调用arr_f0是因为该类型能copy,如果没有copy应该报错???// my_box.arr_f1();//和arr_f0同理// my_box.arr_f2();// 感觉mut 有传递性,arr_f2的第一个要mut,my_box也要mut 否则报错,// 调用了derefMut ,然后直接调用arr_f2方法// 这里rust 先调用了 my_box的deref 方法 返回了 里面的引用。类型是&[i32;2],然后刚刚好调用了arr_f0方法// my_box.arr_f3();// ------------------------------------------------------------------------// my_box.u_arr_f2();// 进行了my_box先调用 derefMut 得到&mut [i32;2] 然后进行了无大小类型转换得到 &[i32]// [i32;2] &[i32;2] *[i32;2]// [i32]// my_box.u_arr_f3();//与上同理// --------------------------------------------------------------------------------// f0(my_box);// f1(&my_box);// 需要手动加& ,rust不会自动添加// f2(&mut my_box);//rust 不会自动加&mut ,需要手动// f3(*my_box);//rust 不自动加*, 这里*的作用调用deref方法// f4(&my_box);// rust 对函数不自动加&,导致deref方法调用不了,手动加,隐式类型转换 调用deref方法// f5(&mut my_box); //rust不自动加& 而且这个函数需要mut , 如果是&my_box也不成功,// 因为不可变不可以调用可变的参数,这里调用了my_box的derefMut返回了可变&mut[i32;2] 函数参数匹配成功// f6(a); 无法使用 编译大小未知// f7(&my_box);//rust不自动添加&,导致deref不能调用,手动添加&,rust会隐式转换调用deref方法,返回&[i32;2]// 然后继续无大小类型转换 &[i32;2] 到&[i32] 函数参数匹配成功,调用函数成功// f8(&mut my_box); // rust不自动添加& ,就算添加,只能调用deref ,不能调用derefMut ,所以手动添加&mut ,//rust然后进行隐式类型转换,调用了derefMut方法,得到&mut [i32;2]类型。发现函数参数依旧不匹配成功。// 进行了无大小类型转换 &mut[i32;2] 得到&mut [i32] ,函数参数匹配成功,调用函数成功
}
不太好说,b站有讲解:Rust方法自动解引用补充和总结(4)_哔哩哔哩_bilibili
相关文章:
Rust方法自动解引用测试,总结和补充
// 定义一个结构体MyBox,包含一个原始指针 struct MyBox<T>(T);// 方法调用 . 操作,对方法的self 进行加& &mut * 还有 无大小转换 trait MyTrait {fn test0(mut self, x: &i32) where Self: Sized {println!("test0 :{}", …...

备战蓝桥杯---动态规划之经典背包问题
看题: 我们令f[i][j]为前i个物品放满容量为j的背包的最大价值。 f[i][j]max(f[i-1][j],f[i-1][j-c[i]]w[i]); 我们开始全副成负无穷。f[0][0]0;最后循环最后一行求max; 负无穷:0xc0c0c0c0;正无穷:0x3f3f3f3f 下面是v12,n6的图示ÿ…...

Go语言每日一练——链表篇(八)
传送门 牛客面试笔试必刷101题 ----------------两个链表的第一个公共结点 题目以及解析 题目 解题代码及解析 解析 这一道题使用的还是双指针算法,我们先求出两个链表的长度差n,然后定义快慢指针,让快指针先走n步,最后快慢指…...

跟着cherno手搓游戏引擎【23】项目维护、2D引擎之前的一些准备
项目维护: 修改文件结构: 头文件自己改改就好了 创建2DRendererLayer: Sandbox2D.h: #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void O…...

Redis(十三)缓存双写一致性策略
文章目录 概述示例 缓存双写一致性缓存按照操作来分,细分2种读写缓存:同步直写策略读写缓存:异步缓写策略双检加锁策略 数据库和缓存一致性更新策略先更新数据库,再更新缓存先更新缓存,再更新数据库先删除缓存…...
7 scala的类构造器
在创建对象的时候,需要调用类的构造器。Scala 提供了主构造器和辅助构造器。 1 主构造器 与 Java 一样,如果我们没有特别定义,那么 Scala 提供的默认构造器是没有参数的。 我们可以在类名后,指定构造器的参数列表,列…...

如何在 Mac 上恢复永久删除的文件:有效方法
您是否错误地从 Mac 中删除了某个文件,并且确信它已经永远消失了?好吧,你可能错了。即使您认为已永久删除计算机上的数据,仍有可能将其恢复。 在本文中,您将了解如何在 Mac 上恢复永久删除的文件,并了解增…...

Web后端开发:事务与AOP
事务管理 在学习数据库时,讲到:事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求,要么同时成功,要么同时失败。 事务的操作主要有三…...

[word] word如何打印背景和图片? #微信#其他#经验分享
word如何打印背景和图片? 日常办公中会经常要打印文件的,其实在文档的打印中也是有很多技巧的,可以按照自己的需求设定,下面给大家分享word如何打印背景和图片,一起来看看吧! 1、打印背景和图片 在默认的…...

Maven - 编译报错:程序包 XXX 不存在(多模块项目)
问题描述 编译报错:程序包 XXX 不存在(多模块项目) 原因分析 检查依赖模块 pom 文件,看是不是引入了如下插件 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-pl…...

Vue事件中如何使用 event 对象
在Vue中,事件处理函数常常需要获取事件触发时的相关信息,比如鼠标位置、按键信息等。而要获取这些信息,就需要使用event对象。那么在Vue的事件中如何正确使用event对象呢?接下来就来详细介绍一下。 首先,在Vue的事件中…...

Golang GC 介绍
文章目录 0.前言1.发展史2.并发三色标记清除和混合写屏障2.1 三色标记2.2 并发标记问题2.3 屏障机制Dijkstra 插入写屏障Yuasa 删除写屏障混合写屏障 3.GC 过程4.GC 触发时机5.哪里记录了对象的三色状态?6.如何观察 GC?方式1:GODEBUGgctrace1…...

决策树之scikit-learn
实例 from sklearn.datasets import load_iris from sklearn import tree import matplotlib.pyplot as plt# Load iris dataset iris load_iris() X, y iris.data, iris.target# Fit the classifier clf tree.DecisionTreeClassifier() clf clf.fit(X, y)# Plot the deci…...
Python爬虫之关系型数据库存储#5
关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录。表可以看作某个实体的集合,而实体之间存在联系,这就需要表与…...

ANSI Escape Sequence 下落的方块
ANSI Escape Sequence 下落的方块 1. ANSI Escape 的用途 无意中发现 B站有人讲解, 完全基于终端实现俄罗斯方块。 基本想法是借助于 ANSI Escape Sequence 实现方方块的绘制、 下落动态效果等。对于只了解 ansi escape sequence 用于 log 的颜色打印的人来说&…...

Vagrant 虚拟机工具基本操作指南
Vagrant 虚拟机工具基本操作指南 #虚拟机 # #vargant# #ubuntu# 虚拟机virtualbox ,VMWare及WSL等大家都很了解了,那Vagrant是什么东西? 它是一组命令行工具,可以象Docker管理容器一样管理虚拟机,这样快速创…...

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安
文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性!感谢神州租车气温与游玩地点总体花费 游玩过程出发时间:Day1-1月25日星期四,西安飞南宁路途中:Day2-1月26日星期五,南宁-湛江-住雷州…...
企业级Spring boot项目 配置清单
目录 一、服务基础配置 二、配置数据库数据源 三、配置缓存 四、配置日志 五、配置统一异常处理 六、配置swagger文档 七、配置用户登录模块 八、配置websocket 九、配置定时任务 十、配置文件服务器 十一、配置Nacos 十二、配置项目启动数据库默认初始化(liquibas…...

WordPress函数wptexturize的介绍及用法示例,字符串替换为HTML实体
在查看WordPress你好多莉插件时发现代码中使用了wptexturize()函数用来随机输出一句歌词,下面boke112百科就跟大家一起来学习一下WordPress函数wptexturize的介绍及用法示例。 WordPress函数wptexturize介绍 wptexturize( string $text, bool $reset false ): st…...
【Iceberg学习三】Reporting和Partitioning原理
Metrics Reporting Type of Reports 从 1.1.0 版本开始,Iceberg 支持 MetricsReporter 和 MetricsReport API。这两个 API 允许表达不同的度量报告,并支持一种可插拔的方式来报告这些报告。 ScanReport(扫描报告) 扫描报告&am…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...