当前位置: 首页 > news >正文

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&#xff0c;包含一个原始指针 struct MyBox<T>(T);// 方法调用 . 操作&#xff0c;对方法的self 进行加& &mut * 还有 无大小转换 trait MyTrait {fn test0(mut self, x: &i32) where Self: Sized {println!("test0 :{}", …...

备战蓝桥杯---动态规划之经典背包问题

看题&#xff1a; 我们令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; 负无穷&#xff1a;0xc0c0c0c0;正无穷&#xff1a;0x3f3f3f3f 下面是v12,n6的图示&#xff…...

Go语言每日一练——链表篇(八)

传送门 牛客面试笔试必刷101题 ----------------两个链表的第一个公共结点 题目以及解析 题目 解题代码及解析 解析 这一道题使用的还是双指针算法&#xff0c;我们先求出两个链表的长度差n&#xff0c;然后定义快慢指针&#xff0c;让快指针先走n步&#xff0c;最后快慢指…...

跟着cherno手搓游戏引擎【23】项目维护、2D引擎之前的一些准备

项目维护&#xff1a; 修改文件结构&#xff1a; 头文件自己改改就好了 创建2DRendererLayer&#xff1a; Sandbox2D.h: #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void O…...

Redis(十三)缓存双写一致性策略

文章目录 概述示例 缓存双写一致性缓存按照操作来分&#xff0c;细分2种读写缓存&#xff1a;同步直写策略读写缓存&#xff1a;异步缓写策略双检加锁策略 数据库和缓存一致性更新策略先更新数据库&#xff0c;再更新缓存先更新缓存&#xff0c;再更新数据库先删除缓存&#xf…...

7 scala的类构造器

在创建对象的时候&#xff0c;需要调用类的构造器。Scala 提供了主构造器和辅助构造器。 1 主构造器 与 Java 一样&#xff0c;如果我们没有特别定义&#xff0c;那么 Scala 提供的默认构造器是没有参数的。 我们可以在类名后&#xff0c;指定构造器的参数列表&#xff0c;列…...

如何在 Mac 上恢复永久删除的文件:有效方法

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

Web后端开发:事务与AOP

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

[word] word如何打印背景和图片? #微信#其他#经验分享

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

Maven - 编译报错:程序包 XXX 不存在(多模块项目)

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

Vue事件中如何使用 event 对象

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

Golang GC 介绍

文章目录 0.前言1.发展史2.并发三色标记清除和混合写屏障2.1 三色标记2.2 并发标记问题2.3 屏障机制Dijkstra 插入写屏障Yuasa 删除写屏障混合写屏障 3.GC 过程4.GC 触发时机5.哪里记录了对象的三色状态&#xff1f;6.如何观察 GC&#xff1f;方式1&#xff1a;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

关系型数据库是基于关系模型的数据库&#xff0c;而关系模型是通过二维表来保存的&#xff0c;所以它的存储方式就是行列组成的表&#xff0c;每一列是一个字段&#xff0c;每一行是一条记录。表可以看作某个实体的集合&#xff0c;而实体之间存在联系&#xff0c;这就需要表与…...

ANSI Escape Sequence 下落的方块

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

Vagrant 虚拟机工具基本操作指南

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

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安

文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性&#xff01;感谢神州租车气温与游玩地点总体花费 游玩过程出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州…...

企业级Spring boot项目 配置清单

目录 一、服务基础配置 二、配置数据库数据源 三、配置缓存 四、配置日志 五、配置统一异常处理 六、配置swagger文档 七、配置用户登录模块 八、配置websocket 九、配置定时任务 十、配置文件服务器 十一、配置Nacos 十二、配置项目启动数据库默认初始化(liquibas…...

WordPress函数wptexturize的介绍及用法示例,字符串替换为HTML实体

在查看WordPress你好多莉插件时发现代码中使用了wptexturize()函数用来随机输出一句歌词&#xff0c;下面boke112百科就跟大家一起来学习一下WordPress函数wptexturize的介绍及用法示例。 WordPress函数wptexturize介绍 wptexturize( string $text, bool $reset false ): st…...

【Iceberg学习三】Reporting和Partitioning原理

Metrics Reporting Type of Reports 从 1.1.0 版本开始&#xff0c;Iceberg 支持 MetricsReporter 和 MetricsReport API。这两个 API 允许表达不同的度量报告&#xff0c;并支持一种可插拔的方式来报告这些报告。 ScanReport&#xff08;扫描报告&#xff09; 扫描报告&am…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

aurora与pcie的数据高速传输

设备&#xff1a;zynq7100&#xff1b; 开发环境&#xff1a;window&#xff1b; vivado版本&#xff1a;2021.1&#xff1b; 引言 之前在前面两章已经介绍了aurora读写DDR,xdma读写ddr实验。这次我们做一个大工程&#xff0c;pc通过pcie传输给fpga&#xff0c;fpga再通过aur…...