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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch: torch.max()函数详解

torch.max函数详解&#xff1a;基于PyTorch的深入探索 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;torch.max()函数简介&#x1f333;&#x1f333;torch.max()的返回值&#x1f333;&#x1f333;torch.max()的应用示例&#x1f333;&am…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(下篇)——Findings论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…

Leetcode2786. 访问数组中的位置使分数最大

Every day a Leetcode 题目来源&#xff1a;2786. 访问数组中的位置使分数最大 解法1&#xff1a;动态规划 状态数组&#xff1a; dp[i][0]: 访问下标范围 [0, i] 中的元素且最后访问的元素是偶数时的最大得分&#xff1b;dp[i][1]: 访问下标范围 [0, i] 中的元素且最后访问…

html5+css3胶囊按钮代码

效果 代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title></title> <style> /* 胶囊开关的样式 */ .switch { position: relative; display: inline-block; width: 6…

EasyExcel操作Excel表格

一、EasyExcel介绍 1.1 介绍 EasyExcel 是一个基于 Java 的简单易用的 Excel 文件读写工具&#xff0c;它提供了一种简单而又高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴开源的项目&#xff0c;它旨在简化开发人员处理 Excel 文件的流程&#xff0c;使得…

Elasticsearch中的动态DSL解决方案

目录 问题背景 解决方案 编写es的mapper 动态dsl编写 使用mapper获取动态dsl 远程调用restful api查询 问题背景 在大数据量的业务系统中&#xff0c;一般都会引入Elasticsearch来作为搜索引擎&#xff0c;而搜索的条件又是多种多样的。回顾下&#xff0c;如果是mysql等…

API网关架构设计与实现的经验总结与实践

API网关是现代微服务架构中的重要组件&#xff0c;它充当了前端和后端微服务之间的中介。本文将介绍API网关的架构设计原则和实现方法&#xff0c;以帮助开发人员更好地理解和应用这些技术。 1. 什么是API网关&#xff1f; - 解释了API网关的基本概念和作用&#xff0c;以及…

【Spring框架】Spring事务的原理

目录 〇、对类或方法的Spring事务属性进行解析 0.1 解析标签 0.2 注册 InfrastructureAdvisorAutoProxyCreator 0.3 判断目标方法是否适合 canApply 0.4 匹配标签 match 0.5 小结 一、Spring事务的实现 1.1 准备事务 1.1.1 收集Transactional注解属性信息&#xff0c;…

美创科技与河南金融信创生态实验室签署战略合作协议

2024年1月31日&#xff0c;由普惠通科技与河南省科学院物理所、北京交通大学、中国金融电子化集团重庆金融认证中心联合发起成立中部地区第一家金融信创生态实验室运营公司&#xff08;即河南豫科普惠通信创科技有限公司&#xff09;与杭州美创科技股份有限公司战略合作签约仪式…

探索Xposed框架:个性定制你的Android体验

探索Xposed框架&#xff1a;个性定制你的Android体验 1. 引言 在当今移动设备市场中&#xff0c;Android系统作为最受欢迎的操作系统之一&#xff0c;其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制&#xff0c;以获得更符合自己习惯的使用…

深度学习自然语言处理(NLP)模型BERT:从理论到Pytorch实战

文章目录 深度学习自然语言处理&#xff08;NLP&#xff09;模型BERT&#xff1a;从理论到Pytorch实战一、引言传统NLP技术概览规则和模式匹配基于统计的方法词嵌入和分布式表示循环神经网络&#xff08;RNN&#xff09;与长短时记忆网络&#xff08;LSTM&#xff09;Transform…

谷歌 DeepMind 联合斯坦福推出了主从式遥操作双臂机器人系统增强版ALOHA 2

谷歌 DeepMind 联合斯坦福推出了 ALOHA 的增强版本 ——ALOHA 2。与一代相比&#xff0c;ALOHA 2 具有更强的性能、人体工程学设计和稳健性&#xff0c;且成本还不到 20 万元人民币。并且&#xff0c;为了加速大规模双手操作的研究&#xff0c;ALOHA 2 相关的所有硬件设计全部开…

Elasticsearch:通过 ingest pipeline 对大型文档进行分块

在我之前的文章 “Elasticsearch&#xff1a;使用 LangChain 文档拆分器进行文档分块” 中&#xff0c;我详述了如何通过 LangChain 对大的文档进行分块。那个分块的动作是通过 LangChain 在 Python 中进行实现的。对于使用版权的开发者来说&#xff0c;我们实际上是可以通过 i…

开源的JS动画框架库介绍

开源的JS动画框架库介绍 在现代网页设计中&#xff0c;动画已经成为提升用户体验的重要手段。它们不仅能够吸引用户的注意力&#xff0c;还能够帮助用户更好地理解和导航网站。JavaScript 动画框架库提供了一套丰富的动画效果&#xff0c;让开发者能够轻松地实现复杂的…

大模型实践笔记(2)——Clip改进:通过文本检索视频帧

目录 超参数设置 配置LLM-clip的backbone 文本编码 抽取视频帧并编码 视频帧匹配 保存结果帧 工程流 全是干货 超参数设置 # 超参数设置 PARAMS {"clip_model": "openai/clip-vit-base-patch32", # 推理模型名称"video_folder": "…

Gitlab和Jenkins集成 实现CI (三)

Gitlab和Jenkins集成 实现CI (一) Gitlab和Jenkins集成 实现CI (二) Gitlab和Jenkins集成 实现CI (三) 自动部署 配置免密ssh 进入http服务器 生成ssh密钥 ssh-keygen -t rsa进入jenkins(容器) 拷贝公钥 ssh-copy-id http服务器用户名http服务器ip #输入http服务器密码配…

问题:老年人心理健康维护与促进的原则为________、________、发展原则。 #媒体#知识分享

问题&#xff1a;老年人心理健康维护与促进的原则为________、________、发展原则。 参考答案如图所示

[SAP] ABAP代码程序美化器大小写格式化设置

按照ABAP开发的规范&#xff0c;ABAP源代码里推荐将所有的关键字大写&#xff0c;其余ABAP变量小写 我们可以手动修改上述代码大小写规范的问题&#xff0c;但如果代码量很多的情况下&#xff0c;手动确保这个规范(所有的关键字大写&#xff0c;其余ABAP变量小写)有点费事&…

k8s -ingress

概念 Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由&#xff0c;ingress能代理集群为内部的网络&#xff0c;将集群外部的HTTP/HTTPS网络请求转发至不同的service&#xff0c;其本质就是创建一个NodePort类型的svc,和一个nginx 组成 k8s中的ingress 其实是指…

Go语言的100个错误使用场景(30-40)|数据类型与字符串使用

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…