Rust-trait

news2025/4/26 0:01:43

Rust语言中的trait是非常重要的概念。

在Rust中,trait这一个概念承担了多种职责。在中文里,trait可以翻译为“特征”“特点”“特性”等。

成员方法

trait中可以定义函数。用例子来说明,我们定义如下的trait:

在这里插入图片描述
上面这个trait包含了一个方法,这个方法只有一个参数,这个&self参数是什么意思呢?

所有的trait中都有一个隐藏的类型Self(大写S),代表当前这个实现了此trait的具体类型。trait中定义的函数,也可以称作关联函数(associated function)。

函数的第一个参数如果是Self相关的类型,且命名为self(小写s),这个参数可以被称为“receiver”(接收者)。具有receiver参数的函数,我们称为“方法”(method),可以通过变量实例使用小数点来调用。

没有receiver参数的函数,我们称为“静态函数”(static function),可以通过类型加双冒号::的方式来调用。在Rust中,函数和方法没有本质区别。

Rust中Self(大写S)和self(小写s)都是关键字,大写S的是类型名,小写s的是变量名。请大家一定注意区分。self参数同样也可以指定类型,当然这个类型是有限制的,必须是包装在Self类型之上的类型。

对于第一个self参数,常见的类型有self :Self、self:&Self、self :&mut Self等类型。对于以上这些类型,Rust提供了一种简化的写法,我们可以将参数简写为self、&self、&mut self。

self参数只能用在第一个参数的位置。请注意“变量self”和“类型Self”的大小写不同。示例如下:

在这里插入图片描述
所以,回到开始定义的那个Shape trait,上面定义的这个area方法的参数的名字为self,它的类型是αSelf类型。我们可以把上面这个方法的声明看成:

在这里插入图片描述
我们可以为某些具体类型实现(impl)这个trait。

假如我们有一个结构体类型Circle,它实现了这个trait,代码如下:

在这里插入图片描述
另外,针对一个类型,我们可以直接对它impl来增加成员方法,无须trait名字。比如:
在这里插入图片描述

静态方法

没有receiver参数的方法(第一个参数不是self参数的方法)称作“静态方法”。静态方法可以通过Type::FunctionName()的方式调用。需要注意的是,即便我们的第一个参数是Self相关类型,只要变量名字不是self,就不能使用小数点的语法调用函数。

在这里插入图片描述

扩展方法

我们还可以利用trait给其他的类型添加成员方法,哪怕这个类型不是我们自己写的。比如,我们可以为内置类型i32添加一个方法:
在这里插入图片描述

完整函数调用语法

Fully Qualified Syntax提供一种无歧义的函数调用语法,允许程序员精确地指定想调用的是那个函数。

以前也叫UFCS(universal function call syntax),也就是所谓的“通用函数调用语法”。

这个语法可以允许使用类似的写法精确调用任何方法,包括成员方法和静态方法。

其他一切函数调用语法都是它的某种简略形式。它的具体写法为::item。示例如下:

在这里插入图片描述
我们定义了两个trait,它们的start()函数有同样方法签名。

如果一个类型同时实现了这两个trait,那么如果我们使用variable.start()这样的语法执行方法调用的话,就会出现歧义,编译器不知道你具体想调用哪个方法,编译错误信息为“multiple applicable items in scope”。

这时候,我们就有必要使用完整的函数调用语法来进行方法调用,只有这样写,才能清晰明白且无歧义地表达清楚期望调用的是哪个函数:

在这里插入图片描述

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

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

相关文章

#Prompt##提示词工程##AIGC##LLM#使用大型预训练语言模型的关键考量

如果有不清楚的地方可以评论区留言,我会给大家补上的! 本文包括: Prompt 的一些行业术语介绍 Prompt 写好提示词的方法经验介绍(附示例教程) LLM自身存在的问题(可以用Prompt解决的以及无法用Prompt解决的&…

Linux基础工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【详解】

目录 linux软件包管理器-yum什么是软件包?查找软件包如何安装软件卸载软件 linux编辑器 - vimvim的基本概念vim模式之间的切换vim命令模式各命令汇总vim底行模式各命令汇总 Linux编译器 - gcc/ggcc/g的作用gcc/g选项预处理编译汇编链接静态库与动态库 Linux调试器 -…

【python】正则表达式-快速信息匹配,过滤与检测

前言 菜某的总结,希望能够帮到大家。 正则表达式的概念 简单来说就是匹配信息,创建一个规则,匹配文本中符合这个规则的内容 作用领域 单单看他的概念可能觉得他的用途也就是查找,实际上他的用途很广泛 1.信息筛选&#xff0c…

一、QT的前世今

一、Qt是什么 1、Qt 是一个1991年由奇趣科技开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务。 2、Qt是面向对象的框架,具有面向对象语言的特性:封装、继承、多态。…

电子学会2023年12月青少年软件编程(图形化)等级考试试卷(三级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(三级) 分数:100 题数:31 一、单选题(共18题,共50分) 1. 运行左图程序,想得到右图中的效果,红色框应填写的数值是?( ) A.

vmware和ubuntu镜像下载地址

这里有vmware16和ubuntu20.0下载 链接:https://pan.baidu.com/s/1i9IC-KnJlrVDbl6SJ5SIKQ?pwdy2dd 提取码:y2dd 链接:https://pan.baidu.com/s/1imqJVD2dLE1TB6jIrq1-Fg?pwd690f 提取码:690f 这个是我本人下的vmware17 密钥可…

超声波眼镜清洗机清洗眼镜会有伤害吗?适合洗眼镜超声波清洗机

眼镜作为日常生活中不可或缺的辅助视力工具,经常需要清洁保养以确保视力清晰和舒适佩戴。随着科技的发展,超声波眼镜清洗机成为越来越受欢迎的清洁方式。然而,很多人可能会担心使用超声波清洗机是否会对眼镜造成损害。但是可以很可以的告诉大…

Vulnhub-Lampiao

一、信息收集 nmap扫描 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.7 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 1024 46:b1:99:60:7d:81:69:3c:ae:1f:c7:ff:c3:66:e3:10 (DSA) | 2048 f3:e8:88:f2:2d:d0:b2:54:0b:…

Xtuner大模型微调

Xtuner大模型微调 一、课程笔记 文档链接:https://github.com/InternLM/tutorial/blob/main/xtuner/README.md 视频链接: https://www.bilibili.com/video/BV1yK4y1B75J/ 大模型微调 大模型的训练利用了各类数据,可以说是一个通才&#xff…

基于Matlab/Simulink开发自动驾驶的解决方案

文章目录 处理自动驾驶数据 仿真自动驾驶场景 设计感知算法 设计规划和控制算法 生成代码和部署算法 集成和测试 参考文献 使用 MATLAB/Simulink开发自动驾驶,能够深入建模真实世界的行为、减少车辆测试并验证嵌入式软件的功能,从而推进自动驾驶感…

宝塔面板使用phpMyAdmin 502 Bad Gateway

第一步软件商店安装PHP 第二步设置phpMyAdmin,选择PHP版本 – 解决

【软件测试】学习笔记-不同视角的软件性能与性能指标

本篇文章探讨新的测试主题:性能测试,因为性能测试的专业性很强,所以我会以从0到1的入门者视角,系统性地阐述性能测试的方法以及应用领域,用实例去诠释各种性能指标。 本篇文章站在全局的视角,帮你梳理软件性…

漏洞复现-nginxWebUI runCmd前台远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【AIGC】Controlnet:基于扩散模型的文生图的可控性

前言 controlnet可以让stable diffusion的生图变得可控。 文章连接:https://arxiv.org/pdf/2302.05543.pdf 摘要 冻结了stable diffusion的预训练模型并重用它的预训练编码层神经网络结构与零初始化卷积层连接,从零开始逐渐增加参数,并确…

C练习——汉诺塔

题目: 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆…

extern static 在linux 和 qt下差别

从五个点来说 1.p3.h 中 静态定义一个const的int 变量并且赋值 2.p5.h 声明函数test2的定义 3. 直接extern 引用声明 test1() 函数 而不是像p5.h一样 把函数声明写到头文件 在别的.c文件直接包含头文件 第二点和第三点 是引用声明函数的两种用法 4.main函数 中static静态定…

GCC工具源码编译

文章目录 背景一、下载源码二、编译前依赖准备2.1 相关工具依赖2.2 相关lib(gmp/ mpfr /mpc)依赖2.2.1 lib源码下载2.2.2 lib源码编译 三、编译GCC3.1 编译3.2 链接 四、报错处理 背景 日常可能涉及到系统里自带GCC版本与被编译源码存在不兼容&#xff…

64位ATT汇编语言整数乘法printf输出

multiplyWithPrint.s里边的内容如下 .section .datastringToShow:.ascii "%d\n\0" .global main .section .text main:movq $4,%raxmovq $2,%rdi# mulq 默认带上rax进行乘积,可以省略rax中的乘数,最后积会放到rax里边。mulq %rdi# C语言的pri…

解决MPICH的GPU初始化失败:一次深入探索

今天来分享“MPICH:MPII_Init_thread(222): gpu_init failed”这个问题的解决方式 文章目录 前言问题原因解决方案 前言 如果在安装MPICH的时候没有注意要一些选项,那么当使用mpicxx mpi_send.cpp -o send && mpirun -n 2 ./send进行编译输出的…

如何调整 Windows 11 任务栏位置、对齐方式,及自定义任务栏

更新于:2023-11-22 分类:Windows 阅读(115407) 评论(12) 如果你是 Windows 11 用户中的一员,一定在不断尝试它的新功能。Windows 11 操作系统采用了全新设计的外观,具有重新设计的 Windows 资源管理器、圆润的窗口边缘和默认将应用…