Rust学习(二):rust基础语法Ⅰ
Rust学习(二)——rust基础语法Ⅰ:
1、关键字:
了解编程语言的同学都清楚,关键字在一门编程语言中的意义,所谓关键字就是语言的创造者及后续开发者们,以及定义好的具有特殊含义和作用的单词,需要注意的是在变量及函数等名命时要避开这些关键字,以避免可能出现逻辑冲突,每种编程语言所拥有的关键字数量并不相同,Rust目前有39个关键字:
Self enum match super as
extern mod trait async false
move true await fn mut
type break for pub union
const if ref unsafe continue
impl return use crate in
self where dyn let static
while else loop struct # 注意Self和self是两个不同的关键字
很多关键字和其他编程语言种的关键字功能类似,比如:for,move,if等,但是也有一些独特的关键字,体现了语言的设计者的精妙构思,比如match在Rust种功能强大,但是在C/C++中对应的switch的功能就相对偏弱。
2、注释:
在编程中注释的作用自然不必多说,就有一句著名的格言展示了注释的重要性:一个程序员在编程时,只有他和上帝知道代码的作用,过了三天就只有上帝知道这段代码的作用了!(doge),因此在编程中加入注释,可以帮助阅读代码的人(也包括作者)更好的理解代码编写过程中的复杂逻辑,从而做出针对性的优化,Rust和C/C++、python等语言相比注释功能更加完整和强大!
Rust的注释有两大类:普通注释和文档注释。
①普通注释:
rust提供了单行和多行普通注释两种方法(和C/C++保持一样):
// 单行注释/*
*
*多行注释
*多行注释
*
*/
②文档注释:
rust非常关注文档和测试,因此提供了专门的文档注释,用于在注释中直接编写文档和测试代码,同时Rust文档采用的时Markdown格式,因此在编写测试文档时,需要注意使用Markdown形式:
//! 生成库文档,用于说明整个模块的功能,一般置于模块开头
/// 生成库文档,用于说明函数和结构体功能,一般置于说明对象的开头//! Math 模块
//!
/// #add 函数
/// 该函数为求和函数
///
/// # Example
/// use math::add;
/// assert_eq!(3, add(1, 2));
fn add(x: i32, y: i32) -> i32 {// 求和x + y
}
3、Rust名命风格:
名命风格并不是强制要求,但是应该被看做时一种规范而被遵循。Rust推荐采用驼峰式命名(UpperCamelCase)来表示类级别的内容,而采用蛇形命名(snake_case)类描述值级别的内容,可见下表:
项 约定
包 snake_case
类型 UpperCamelCase
特性 UpperCamelCase
枚举 UpperCamelCase
函数 snake_case
方法 snake_case
构造函数 (无特殊要求)或者new
转换函数 (无特殊要求)
宏 snake_case
局部变量 SCREAMING_SNAKE_CASE
静态变量 SCREAMING_SNAKE_CASE
常量 sanke_case
类型参数 UpperCamelCase
生命周期 lowercase
下面这个例子给大家提供了一个很好的参考:
// 枚举
enum Result<T,E> {Ok(T),Err(E),
}
// 特性trait
pub trait From<T> {fn from<T> -> Self;
}
// 结构体:
struct Rectangle {height: i32,width: i32,
}
impl Rectangle {//构造函数fn new(height: i32, width: i32) ->Self {Self {height, width}}// 函数fn calc_area(&self) ->i32 {self.height * self.width}
}// 静态变量和常量
static NAME: &str = "kew";
const AGE: i32 = 25;// 宏定义:
macro_rules! add{($a:expr, $b:expr) => {{$a + $b}}
}// 变量及宏使用:
let sum_of_nums = add!(1,2);
4、常量:
Rust中的常量和C++中的常量基本一致,特点是不可修改,不可覆盖,使用const关键字定义:
//常量定义,类似于C/C++中的#define(宏定义)
const AGE: i32 = 1984;
// AGE = 1985; 报错, 常量不允许被修改
// const AGE: i32 = 1996; 报错,AGE已经被定义过,不能被覆盖
5、变量:
rust中变量使用let定义,变量是一个绑定到一个名称且允许改变(可覆盖)的值,但在Rust中有一些不同,默认直接使用let定义的变量不可修改,使用mut关键字方可修改:
let x: f64 = 3.14;
// x = 6.28; 报错,变量不可修改
let x: f64 = 6.28; //变量可以被覆盖let mut y: f64 = 256.01;
y = 3.28;
let y: f64 = 2024; // 使用mut关键字之后变量可修改,可覆盖。
6、静态变量:
静态变量是一种特殊的变量,可以被修改,但是不能被覆盖,同时其是否可修改同样取决于是否使用mut关键字:
static NAME: &str = "rust";
// NAME = "new"; 报错,未使用mut不可以被改变
static mut NUM: i32 = 12;
unsafe {NUM += 1; // 可以看到static mut 修改是在unsafe中完成的,所以日常开发中使用较少
}
// static NAME: &str = "Cargo"; 报错,静态变量不可覆盖
// static NUM: i32 = 13; 错误,静态变量不可覆盖
7、数据类型:
学习一门编程语言,一定会从数据类型入手,这点就好比学习C语言的char、array类型,python的整型、浮点型等,如果学习一门编程语言却不知道数据类型,未免太不专业了!
数据类型是一门语言的基础,所有复杂的模块都是由基础数据类型构建而来的,Rust的基础数据类型分为标量类型和符合类型两大类型,标量类型代表一个单独的值,复合类型则是将多个值组合成一个值的类型(有点绕,不要着急,下文会仔细解释!)
(1)标量类型:
Rust中有四种基本的标量类型:整型、浮点型、布尔型和字符型。
①整型:
整型即整数:没有小数部分的的数字,根据长度和符号,可分为12类,其中i表示有符号整型,u表示无符号整型:
长度 有符号 无符号
8 i8 u8
16 i16 u16
32 i32 u32
64 i64 u64
128 i128 u128
arch isize usize
这里需要特别指出,isize和usize是指和计算机架构相匹配的整型长度,如64位机器isize和usize都是64位长度,32位机器isize和usize都是32位长度的。
②浮点数:
rust中的浮点数分为:f32和f64两种类型(都是有符号的),默认为64位。
③布尔类型:
和其他类型一致,都是true和false两类(doge)。
④字符型:
rust的字符和C语言中的char是一致的,注意:字符使用单引号声明,而字符串使用双引号声明,字符串属于数组类型。
// Unicode 标量:字符型
let c = 'a';
// 数组字符串:
let str_c = "hello rust";
(2)复合类型:
①元组:
元组是一种能够将多个类型的数据值组合成复合值得类型,即所谓将多个值合并为一个值。一旦声明元组得长度就不可改变,元组使用圆括号包裹,并用逗号分隔。为了从元组中获取值,你可以使用模式匹配和点符号(类似于其他语言得索引,从下标0开始)。
let tup: (i32, i32,i64) = (1, 2, 3);// 使用模式匹配:
let (x, y, z) = tup;let tup2:(i32, i32, i32) = (2,3,4);
let zero = tup2.0 // 点符号获取值
②数组:
Rust中得数组和C/C++中得数组类似,数组中得每一个元素必须保持一致,且长度也不可以改变。但是Rust为我们提供了可变数组,使用Vec定义得数组,允许增长长度,大部分时候,我们使用得也是Vec定义得数组:
// 定义数组
let numbers = ["a", "b", "c"];
let digits[i32;5] = [0, 1, 2, 3, 4, 5]; // 通过[type;num]定义数组
let zeros = [0;5]; //创建一个包含5个0得数组let bundary = numbers[0];
(3)数据类型转换:
Rust中得数据类型大多数是可以互相转换得,比如将i8转换为i16就是合理转换,但rust中不支持原生类型之间得隐式转换(将字符型转换为浮点型),必须使用as关键字进行显性转换。
fn main() {let decimal:f32 = 61.234;// let integer: u32 = decimal; 错误!不能进行隐式转换let integer = decimal as u32; //正确!,使用as进行显示转换
}
更加复杂得类型中,Rust提供了From和Info两个trait进行转换:(trait是一个难点,后面会具体介绍)
pub trait From<T> {fn from<T> ->Self;
}
pub trait Into<T> {fn into<T> ->Self;
}struct Complex {real:i32,imag:i32
}impl From<i32> for Complex {fn from(real:i32) ->Self {Self {real, imag:0}}
}fn main() {let c1: Complex = Complex::from(2);let c2: Complex = 2.into();println!("c1:{:?}, c2:{:?}", c1, c2);
}
相关文章:

Rust学习(二):rust基础语法Ⅰ
Rust学习(二)——rust基础语法Ⅰ: 1、关键字: 了解编程语言的同学都清楚,关键字在一门编程语言中的意义,所谓关键字就是语言的创造者及后续开发者们,以及定义好的具有特殊含义和作用的单词&am…...

【WebRTC】视频发送链路中类的简单分析(下)
目录 1.任务队列节流发送器(TaskQueuePacedSender)1.1 节流控制器添加RTP数据包(PacingController::EnqueuePacket())1.2 监测是否要处理Packet(PacingController::MaybeProcessPackets()) 2.数据包路由&am…...

HTML(超文本标记语言)
HTML(超文本标记语言 - HyperText Markup Language)是一种用于创建网页的标准标记语言。 HTML 最初是由蒂姆・伯纳斯 - 李(Tim Berners - Lee)在 1990 年左右开发的。当时的目的是为了让世界各地的科学家能够方便地共享和交流信息…...

CatBoost中目标变量统计
CatBoost中的目标变量统计(Target Statistics)是其处理分类特征(Categorical Features)的核心技术之一。目标变量统计是一种特殊的编码方法,通过利用目标值信息生成数值特征,从而替代传统的独热编码或其他处…...

WSL与Ubuntu系统--使用Linux
WSL与Ubuntu系统--使用Linux 前言基础教学视频卸载链接网络配置方法1方法2 正式安装步骤步骤1 基本命令修改网络配置Ubuntu系统的导出与导入文件操作给Ubuntu创造界面--也就是在装一个有界面的UbuntuHyper-v与windows主机文件共享 前言 需要链接梯子,并且梯子十分稳…...

操作系统离散存储练习题
1. (简答题)分页存储管理系统具有快表,内存访问时间为2ns,检索快表时间为0.5ns,快表命中率为80%,求有效访问时间 -分析:首先访问缓存(快表),如果没有找到访问内存(页表&…...

性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章
2017年,谷歌发布《Attention Is All You Need》论文,首次提出Transformer架构,掀开了人工智能自然语言处理(NLP)领域发展的全新篇章。Transformer架构作为神经网络学习中最重要的架构,成为后来席卷全球的一…...

PHP反序列化_3-漏洞利用
1. 信息收集与分析 确定目标应用程序:首先需要找到存在反序列化漏洞的 PHP 应用程序。这可能是一个网站、Web 服务、内部系统等。可以通过网络扫描、漏洞报告、安全评估等方式来发现潜在的目标。分析应用程序逻辑:了解目标应用程序的功能和业务逻辑&…...

2.初始sui move
vscode安装move插件 查看sui 客户端版本号 sui client --version 创建新项目 sui move new <项目名> sui move new hello_world 项目目录结构: hello_world ├── Move.toml ├── sources │ └── hello_world.move └── tests└── hello_world…...

数据结构--排序算法
目录 一.排序相关概念二.常见排序算法1.堆排序2.插入排序3.希尔排序4.选择排序5.冒泡排序6.快速排序1.快速排序--递归(未优化)2.快速排序--递归(优化)3.快速排序--非递归 7.归并排序1.归并排序--递归2.归并排序--非递归 一.排序相关概念 排序:使一串记录按照某个关…...

day60 图论章节刷题Part10(Floyd 算法、A * 算法)
Floyd 算法 思路:本题是多源最短路问题,使用Floyd算法求解。Floyd 算法对边的权值正负没有要求,核心思想是动态规划。 我们使用动规五部曲来理解和应用Floyd算法: 1、确定dp数组(dp table)以及下标的含义…...

UI架构解说
UI(用户界面,User Interface) 是指用户与软件或硬件系统进行交互的界面。 它是用户与系统之间的桥梁,允许用户通过视觉元素、交互组件和反馈机制来操作和控制应用程序或设备。 UI 设计的目标是提供直观、易用和愉悦的用户体验&a…...

车机安装第三方软件实现打开软件全屏教程
简介 越来越多的车友实现安装第三方软件了,但是有的车机的状态栏或者导航栏会遮挡安装的第三方软件。这样的话,第三方软件就会显示不全,体验感非常不好。所以,下面我教一下大家如何使用东君应用管家来实现打开第三方软件全屏。 全…...

八大技术架构与演进2
垂直分库架构 当数据量不断增大,大量的数据都存储在一个库中就已经不太够用了,这时候就可以讲不同的数据分类别存储Mycat也支持在大表拆分为小标的情况下进行访问 但是这种做法其实是增加了数据库的运维难度,这种其实也就叫做分布式数据库&…...

ReactPress技术揭秘
ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 一、引言 ReactPress是一个基于React构建的开源发布平台,它不仅可以帮助用户在支持React和MySQL数据库的服务器上快速搭建自己的博客或网站,还能作为一个…...

Javascript高级—如何实现一个类型判断函数?
实现一个类型判断函数 判断null判断基础类型使用Object.prototype.toString.call(target)来判断引用类型 [!NOTE] 注意: 一定是使用call来调用,不然是判断的Object.prototype的类型 之所以要先判断是否为基本类型是因为:虽然Object.prototyp…...

asitop macOS 终端 性能监控
macOS 终端 性能监控 安装 pip python3 -m ensurepip# pip3 --version pip 21.2.4安装 asitop pip3 install asitop运行 sudo asitop参考 asitopgithub asitopHow to Install pip on Mac...

Unity学习笔记(4):人物和基本组件
文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班,有空闲时间。争取一天学一课,养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶ÿ…...

【深圳大学/大学物理实验2】弗兰克-赫兹实验预习题参考
一、单选题 共 13 小题 共 78 分 1. (6分)第一栅极电压UG1、第二栅极电压UG2和减速电压UP的作用分别是( ) 学生答案:C √ A. 使电子加速,消除阴极电子散射,使电子减速 B. 产生并加速电子,使电子加速&…...

vue2.7.14 + vant + vue cli脚手架转vite启动运行问题记录
文章目录 前言方案一(借用插件转换)启动命令,转换方案一转换遇到的问题 方案二(手动调整)方案两者对比小结 前言 vue cli 脚手架转成vite启动 简单说说这个项目的一些底层基本结构哈,以及写这篇博客的目的…...

Java基础-内部类与异常处理
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、Java 内部类 什么是内部类? 使用内部类的优点 访问局部变量的限制 内部类和继承 内部…...

vue2或vue3的name属性有什么作用?
在 Vue.js(无论是 Vue 2 还是 Vue 3)中,组件的 name 属性有几个重要的用途。虽然它不是必须的,但在某些情况下非常有用。以下是 name 属性的一些主要作用: 1. 调试工具 Vue Devtools 和其他调试工具会使用组件的 nam…...

【FOC进阶日记】实战篇③ 电机关键数据采集方法
作者 | 量子君 微信公众号 | 极客工作室 【FOC进阶日记】专栏目录 第一章 实战篇① FOC与SVPWM详解 第二章 实战篇② 自发电控制算法 第三章 实战篇③ 电机关键数据采集方法 文章目录 前言一、M法(从路程入手):二、T法(从时间入手)三、M/T测速法:四、实现过程:总结前言…...

XSS安全基础
欢迎关注公众号【测试开发备忘录】,交流学习经验 XSS 类型: 反射型XSS:简单的把用户输入的数据“反射”给浏览器,将恶意链接嵌入,非持久; 存储型XSS:把用户输入的数据“存储”在服务端…...

【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(3)
前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 本章是去答案版本。带答案的版本在下…...

516.最长回文子序列
刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…...

leetcode hot100【LeetCode 114.二叉树展开为链表】java实现
LeetCode 114.二叉树展开为链表 题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 展开后的单链表应该与…...

SpringMVC学习记录(二)之接收数据
SpringMVC学习记录(二)之接收数据 一、快速搭建SpringMVC框架1、配置分析2、准备项目3、Controller声明4、Spring MVC核心组件配置类5、SpringMVC环境搭建6、启动测试 二、SpringMVC接收数据1、访问路径设置1)精准路径匹配2)模糊路…...

C语言串讲-3之函数和数组
1.函数名是一个指针,保存函数地址入口。函数名是函数的入口地址。函数的入口地址称为函数指针。 2.传参--本质是创建副本 (1)实参与形参 (2)值传递,指针传递,引用传递 …...

设计模式-状态模式(State)
允许一个对象内部状态改变时改变它的行为,对象看起来似乎修改了它的类 问题: 状态模式和有限状态机紧密相关。其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个…...