Rust 中Self 关键字的两种不同用法

news/2024/6/17 22:54:53 标签: rust, 开发语言, 后端

在 Rust 中,Self 是一个特殊的类型标识符,它代表了当前结构体或枚举类型。在结构体或枚举类型的定义中,Self 可以用于表示该类型的任何地方,包括方法签名、构造函数、类型别名等。

  1. 构造函数中的 Self: 在这段代码中:
rust"> pub fn new(_session_id: u32, _channel_id: u32) -> Self {
       Self {
           // ...
       }
   }

这里的Self是结构体或枚举类型的占位符。在构造函数new的返回类型和内部实例化部分使用Self时,它代表的是当前实现这个方法的结构体或枚举类型本身。所以在这个上下文中,Self { ... } 创建了一个新的结构体实例,并初始化了所有字段。

在以下代码中,Self { value: 42 } 是一个构造函数,用于创建一个 Example 结构体的新实例,其中value成员变量被初始化为 42

rust">struct Example {
    value: i32,
}

impl Example {
    fn new(value: i32) -> Self {
        Self { value }
    }
}

在给定的代码片段中,Self { … } 表示的是当前结构体或枚举类型的构造函数。它用于创建一个新的实例,并且可以接受一些参数来初始化该实例的成员变量。

  1. 关联函数(非方法)中的 self 或 &self、&mut self 等: 在方法签名中,如:
rust"> fn some_method(&self) {}

这里的 self 表示方法接收者。在方法定义中,self、&self 和 &mut self 分别表示:

  • self: 消耗所有权,意味着调用此方法会移动结构体的所有权.
  • &self: 获取结构体的一个不可变引用,允许访问但不修改结构体内容。
  • &mut self: 获取结构体的一个可变引用,允许在方法执行期间修改结构体内容。

http://www.niftyadmin.cn/n/5439216.html

相关文章

Android Kotlin版封装EventBus

文章目录 Android Kotlin版封装EventBus代码封装添加依赖库定义消息类定义常量值定义注解定义工具类 使用在Activity中在Fragment中发送事件 源码下载 Android Kotlin版封装EventBus 代码封装 添加依赖库 implementation("org.greenrobot:eventbus:3.3.1")定义消息…

Spark-Scala语言实战(3)

在之前的文章中,我们学习了如何在来如何在IDEA离线和在线安装Scala,想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实…

publicPath 和 __webpack_public_path__ 和 process.env.BASE_URL的区别和使用方法

文章目录 publicPath 和 __webpack_public_path__ 和 process.env.BASE_URL的区别和使用方法1. publicPath(1)publicPath定义(2)publicPath使用方法方法1:静态文件使用publicPath。方法2:项目打包时使用pub…

供应链安全之被忽略的软件质量管理平台安全

背景 随着我国信息化进程加速,网络安全问题更加凸显。关键信息基础设施和企业单位在满足等保合规的基础上,如何提升网络安全防御能力,降低安全事件发生概率?默安玄甲实验室针对SonarQube供应链安全事件进行分析,强调供…

ctf_show笔记篇(web入门---反序列化)

目录 反序列化 254:无用,是让熟悉序列化这个东西的 255:直接使$isViptrue 256:还是使用变量覆盖 257:开始使用魔法函数 258:将序列化最前面的过滤了,使用绕过 259: 这一题需要看writeup才…

查找1的个数

小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 . 如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)组成一个连通分块。 请问…

Kafka整理-Kafka与传统消息队列系统(如RabbitMQ, ActiveMQ)的区别是什么?

Apache Kafka与传统消息队列系统(如RabbitMQ, ActiveMQ)虽然都是处理消息和数据流的中间件,但它们在设计理念、架构、功能和使用场景方面有显著的区别。下面是Kafka与传统消息队列系统的主要区别: 1. 设计目的和使用场景 Kafka: 设计初衷是为处理大量的实时数据流。强调高…

论文解读—— 基于边缘梯度方向插值和 Zernike 矩的亚像素边缘检测

论文:《 Subpixel edge detection based on edge gradient directional interpolation and Zernike moment》 地址: http://www.dpi-proceedings.com/index.php/dtcse/article/view/24488 摘要 在本文中,我们提出了一种基于边缘梯度方向插值…