Rust编程(二)语法和数据类型

news2024/9/19 10:58:14

编程规范

类C语法,函数需要定义,指令需要以;结尾。需要大括号{}
文件名,变量,函数命名使用snake case,eg:new_function()
结构体,特征命名,使用大驼峰命名,eg:Student,ChangeInfo

数据类型

Rust 是 静态类型(statically typed)语言,每个数据都必须声明类型,数据的初始化方式为let a : Type = value;

let a : i32 = 6;
let b : f32 = 6.0;
let c : char = '6';
let d : [i32;6] = [1,2,3,4,5,6]
let e : (char,i32) = ('6',6);
let f : Vec<i32> = Vec::new();

Rust中的变量默认是不可变的,如果想要可变,需要添加mut关键字:

let mut g: i32 = 1;

基本标量:

  • 整型:i32
  • 浮点型:f32
  • 布尔类型:bool
  • 字符类型:char
    复合数据类型:
  • 原生数组:[i32;5]
  • 元组:(i32,i32,i8)
  • 【Rust 标准库提供】可变数组:Vec
  • Sring,字符串
  • &str:字符串面值,可以理解为,“abc”就是字符串面值,跟其他语言一样不可更改,而String则是另一种字符串,他可以修改,可以添加,删除,替换等等,跟C++的String别无二样。

所有权

Rust通过控制所有权来实现内存管理
Rust中所有的变量都是有所有权的,变量的初始化被称为变量绑定,即将这个数据绑定到这个变量上。
Rust对于简单基本数据类型,会直接进行拷贝,不会考虑所有权问题,但是对于复杂数据类型,就有所有权制度了,如下

let s1 = Stinrg::from("name");
let s2 : String;
s2 = s1;
println!("{}",s1);
//这种情况就会报错,因为Rust中,对于复杂数据类型,等于号默认就是所有权的交接,
//此时数据的所有权已经从s1转移到s2了,这种称为move
//也就是说,Rust中默认的=是move而不是浅拷贝
//Rust中有一个特征是Copy,实现了Copy特征的,都是拷贝而不是move,
//官方给出的可以Copy的类型规则:任何基本类型的组合可以 Copy ,不需要分配内存或某种形式资源的类型是可以 Copy 的。

请添加图片描述
Rust中的函数传参也适用所有权制度:

let s3 = String::from("value");
a_function(s3) 
//此时s3数据的所有权已经move给函数了,
//在函数调用结束时,如果所有权不传出来,那么Rust就会自动调用drop清理掉相应数据的内存。

所有权传来传去很麻烦,所以就设计了引用和借用机制:

let x: i32 = 1;
let y = &x;

println!("{},{}",x,*y);
//引用机制,直接指向同一个地址

请添加图片描述
引用,一个指针指向了原数据类型,只能看不能改。

还记得前面说的可变与不可变性吗?如果想要获得修改权,就需要借用,引用只能看不能改。

let x: i32 = 1;
let temp = &x; //引用,一旦引用了,原数据就不能再被借用了,确保在引用期间数据不会改变。
let y = &mut x; //借用,把上面的那句引用注释掉就可以借用了
*y = 6; //借用,可以修改
println!("The value of y is: {}", y);
println!("The value of x is: {}", x); //会报错,此时x处于被借用状态,自己没法用
let y = 1; //给y绑定一个新的值,把原本的y覆盖掉
println!("The value of x is: {}", x); //此时就又可以用了,而且值也已经修改了。
//其实不覆盖也可以,因为Rust检测到后面y不用了就会自动把借用还回去,可以把let y = 1注释掉,依旧可以。

其实所有权,引用和借用的机制很简单,就是把数据和变量分开了,变量是数据的所有者,所有权就是指把数据分配给这个变量了。
转移所有权就是指把这个数据转移给另一个变量,原变量就go die了。
引用就是指可以看这份数据但是不能改,而且数据的所有者不能再把数据借给其他变量。
借用就是指将数据暂时借给其他变量,在借给其他变量后,原变量就像个植物人一样,啥也不能干,但是借用一旦归还,就又活过来了。

控制流

常见if-else,for,while,该有的都有

函数

fn function(inputvalue:input_type,inputvalue2:input_type2) -> return_type {
	println!("This is a function");
	let result: return_type = value;
	return result;
}

结构体

Rust中没有类的概念,取而代之的是跟C一样的struct,struct不能继承,早期的Rust有virtual struct,是可以继承的,后面删除了,不能使用继承了。Rust实现多态的方式是使用特征trait。

封装继承,多态,是面向对象编程的三个特征,这是目前最常见的说法。不过我们跳出这三个特征来谈OOP(面向对象),我们会发现,其实面向对象的主要思想就类似于状态机一样,对象就是状态的封装,通过行为来不断改变状态,最终得到结果,而多态是为了实现同一个行为可以应对复用在多个状态机上。从这个角度出发,我们就不难理解为什么Rust要这么设计了,Rust认为要实现多态不一定非要使用继承,继承反而会破坏掉封装,我们的目的只是要复用行为,没必要把状态机之间扯上关系,所以,Rust将状态和行为分开封装,状态封装为了struct,行为封装成了方法,而想要在多个状态上复用的行为,封装成了特征,struct不需要知道自己和哪个struct共用特征,只需要实现相应的特征即可,特征在特定的上下文也可以识别出自己接受的struct类型,达到和继承一样的效果。不过Rust官方并不称为自己是面向对象语言,虽然可以用OOP的方法来编程,但是会跟所有权等机制格格不入。

struct Person{
	name : String,
	age : i32,
	address : String,
}

方法

跟传统OOP中的成员函数一样。

impl Person{
	fn change_name(&mut self,new_name) -> (){
		self.name = new_name;
	}
}

特征trait

trait是Rust中独有的一种机制,有点像接口类的概念,如果不同的类型具有相同的行为,那么我们就可以定义一个特征,然后为这些类型实现该特征。定义特征是把一些方法组合在一起,目的是定义一个实现某些目标所必需的行为的集合。
如下,我们定义了一个特征,名称为ChangeInfo,所有有该行为需求的类都可以实现一个该特征,例如Student和Teacher。

pub trait ChangeInfo{
    fn change_name(&mut self,new_name) -> (); //注意,这里是;不是{}
    fn init_all_info(&mut self) -> (){ //也可以设置默认实现,默认实现允许调用相同特征中的其他方法,哪怕这些方法没有默认实现。
    	self.change_name(String::new());
	}
}

struct Student{
	name: String,
}

impl ChangeInfo for Student{
	fn change_name(&mut self,new_name) -> (){
		self.naem = new_name;
	}
}

struct Teacher{
	name: String,
}

impl ChangeInfo for Teacher{
	fn change_name(&mut self,new_name) -> (){
		self.naem = new_name;
	}
}

fn main(){
	let student:Student = Student{
		name:String::new(),
	}
	student.init_all_info();
	student.change_name(String::from("Wang"));
	
}

还可以使用特征来作为参数:

pub fn function(item: &impl ChangeInfo) { //使用实现了ChangeInfo的类型作为参数
    item.init_all_info();
}

trait还有很多应用方法,具体可以看Rust圣经

泛型

Rust支持泛型编程,跟C++的泛型没有很大区别
Rust中的泛型也分为:函数泛型,结构体泛型
Rust中的泛型也可以进行模板特化,为某一种特殊的数据类型进行单独实现。
Rust在1.5以后也可以支持类似于C++参数模板的功能了。

fn display_array<T: std::fmt::Debug, const N: usize>(arr: [T; N]) {
//T是要实现了Debug特征的类型,N是一个const 泛型,是一个值
    println!("{:?}", arr);
}
fn main() {
    let arr: [i32; 3] = [1, 2, 3];
    display_array(arr);

    let arr: [i32; 2] = [1, 2];
    display_array(arr);
}

总结

Rust面向对象上与C++有理念上的不同,所以实现也有较大区别,但是在泛型上,跟C++区别不大。至于Rust所独有的所有权以及借用和引用,是为了实现内存安全和像C++一样的速度而设计的,如果依旧使用深拷贝和浅拷贝机制,不加以管理让用户自己选择拷贝策略或者像Python一样默认浅拷贝,会内存不安全。如果默认深拷贝,则会效率极低。

Python可以默认浅拷贝是因为有GC兜底,内存管理不依赖程序员。

所以,Rust比较新,但是也没有说新到颠覆一切。合理看待。

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

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

相关文章

各城市宗族文化姓氏占比数据

各城市宗族文化姓氏占比数据 1、指标&#xff1a;省份代码、所属省份、城市代码、所属城市、第1大姓氏、第2大姓氏、第3大姓氏、宗族文化强度 2、方法说明&#xff1a; 根据2005年全国1%的人口调查数据计算。其中第1大姓氏第一大姓人口数/总人口数&#xff0c;宗族文化强度(…

脏牛提权(靶机复现)

目录 一、脏牛漏洞概述 二、漏洞复现 1.nmap信息收集 1.1.查看当前IP地址 1.2.扫描当前网段&#xff0c;找出目标机器 1.3.快速扫描目标机全端口 三、访问收集到的资产 192.168.40.134:80 192.168.40.134:1898 四、msf攻击 1.查找对应exp 2.选择对应exp并配置相关设…

关于dell SC4020/SCv2000中的BBU电池的一些常见问题汇总

近期销售了一些DELL SC4020/SCv2000的BBU&#xff08;PN&#xff1a;0XJW8Y 或者 0C27CW&#xff09;电池&#xff0c;有一些共性的问题&#xff0c;这里汇总下&#xff0c;供朋友们参考。还有没有覆盖到的问题&#xff0c;可以加VX: StorageExpert继续讨论。 1. 两个PN是否通用…

2023年蓝桥杯省赛——数组分割

目录 题目链接&#xff1a;1.数组分割 - 蓝桥云课 (lanqiao.cn) 思路 数学问题解答 思路 代码实现 总结 题目链接&#xff1a;1.数组分割 - 蓝桥云课 (lanqiao.cn) 思路 众所周知&#xff0c;蓝桥杯又叫&#xff0c;数学杯&#xff0c;这道题其实就是一个数学问题&#x…

Web应用防火墙是什么?分享工作原理及部署建议

Web应用防火墙&#xff08;WAF&#xff09;诞生于互联网的早期时间&#xff0c;它通常会感知用户、会话和应用&#xff0c;了解其背后的Web应用及其提供的服务。正因如此&#xff0c;WAF可以看作是用户和应用之间的中介&#xff0c;并会提前对往来于两者之前的通信进行分析。那…

matlab实现神经网络检测手写数字

一、要求 1.计算sigmoid函数的梯度&#xff1b; 2&#xff0e;随机初始化网络权重&#xff1b; 3.编写网络的代价函数。 二、算法介绍 神经网络结构&#xff1a; 不正则化的神经网络的代价函数&#xff1a; 正则化&#xff1a; S型函数求导&#xff1a; 反向传播算法&…

蓝桥杯2023年第十四届省赛真题-买瓜|DFS+剪枝

题目链接&#xff1a; 0买瓜 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-买瓜 - C语言网 (dotcpp.com) &#xff08;蓝桥官网的数据要求会高一些&#xff09; 说明&#xff1a; 这道题可以分析出&#xff1a;对一个瓜有三种选择&#xff1a; 不拿&#xff0c…

C语言笔记:重学输入和输出

ACM金牌带你零基础直达C语言精通-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a;ACM金牌带你零基础直达C语言精通https://www.bilibili.com/cheese/play/ep159068?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说…

AI论文速读 | 具有时间动态的路网语义增强表示学习

论文标题&#xff1a; Semantic-Enhanced Representation Learning for Road Networks with Temporal Dynamics 作者&#xff1a; Yile Chen&#xff08;陈亦乐&#xff09; ; Xiucheng Li&#xff08;李修成&#xff09;; Gao Cong&#xff08;丛高&#xff09; ; Zhifeng Ba…

深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析

iOS开发作为移动应用开发的重要领域之一&#xff0c;对于开发人员具有重要意义。本文将深入探讨iOS开发的各个方面&#xff0c;从创建第一个iOS程序到纯代码实现iOS开发&#xff0c;带领读者全面了解iOS应用程序的开发流程和技术要点。 &#x1f4f1; 第一个iOS程序 在创建第…

第1章 实时3D渲染流水线

前言 本书所剖析的Unity 3D内置着色器代码版本是2017.2.0f3&#xff0c;读者可以从Unity 3D官网下载这些着色器代码。这些代码以名为builtin_shaders-2017.2.0f3.zip的压缩包的形式提供&#xff0c;解压缩后&#xff0c;内有4个目录和1个license.txt文件。 目录CGIncludes存放了…

【系统架构师】-基础知识整理

1、面向对象设计得四种关系 关系类型概念特点例子关联关系表示不同类的对象之间有联系&#xff0c;但是一方并不完全拥有另一方&#xff0c;也不对其生命周期负责。关联关系可以是单向的也可以是双向的。耦合度高通常用来表示不同类的对象之间的联系&#xff0c;如“使用”或“…

Kafka消费者:监听模式VS主动拉取,哪种更适合你?

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Kafka消费者&#xff1a;监听模式VS主动拉取&#xff0c;哪种更适合你&#xff1f; 前言监听模式的实现监听器&#xff08;Listener&#xff09;的概念和作用使用监听器实现 Kafka 消费者的步骤和方法…

DDoS攻击升级,解读防御DDoS攻击的几大有效方法

前不久&#xff0c;Gcore发布了2023年第三、四季度DDoS攻击趋势报告&#xff0c;报告中指出DDoS攻击的规模以及复杂性持续增长&#xff0c;且这种增长是触目惊心的。全球每天大约发生23000次DDoS攻击&#xff0c;每39秒就会发生一次新的网络攻击&#xff0c;电信公司、政府部门…

javaSwing连连看游戏

一、简介 基于java的连连看游戏设计和实现&#xff0c;基本功能包括&#xff1a;消除模块&#xff0c;重新开始模块&#xff0c;刷新模块&#xff0c;选择难度模块&#xff0c;计时模块。本系统结构如下&#xff1a; &#xff08;1&#xff09;消除模块&#xff1a; 完成连连…

【MATLAB源码-第13期】基于matlab的4ASK的误码率BER和误符号率SER理论和实际对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 "4ASK" 是一种数字调制技术&#xff0c;代表4级振幅移移键控&#xff08;4-Level Amplitude Shift Keying&#xff09;调制。它是一种数字通信中常用的调制方式之一&#xff0c;用于将数字信号转换为模拟信号以便传…

map china not exists. the geojson of the map must be provided.

map china not exists. the geojson of the map must be provided. 场景&#xff1a;引入echarts地图报错map china not exists. the geojson of the map must be provided. 原因&#xff1a; echarts版本过高&#xff0c;ECharts 之前提供下载的矢量地图数据来自第三方&…

小白学视觉 | 图像上的 OpenCV 算术运算

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;图像上的 OpenCV 算术运算 1 OpenCV 简介 图像可以进行算术运算&#xff0c;例如加法、减法和按位运算&#xff08;AND、OR、NOT、XOR&#xff09;。…

模拟器App抓包 - 证书双向验证绕过手段

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog 0x00 Frida 环境配置 1. 本地安装 Frida pip install frida pip install frida-tools2. 模拟器安装 Fr…

【详细讲解yarn的安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…