进军rust:从0开始学习rust语法

一.变量类型

Rust语言中的基础数据类型有以下几种:

1.整数型

整数型简称整型,按照比特位的长度和有无符号位可以分为以下几种

isize和usize两种整数类型是用来衡量数据大小的,它们的位长度取决于所运行的目标平台,如果是32位架构的处理器将使用32位位长度整型。

整型变量默认使用i32.

2.浮点数型

Rust和其他语言一样支持32位浮点数(f32)和64位浮点数(f64)

64位浮点数的精度更高,因为它有64个比特位可以表示数据

因为现代计算机处理器对两种浮点数计算的速度几乎相同,默认情况下计算机会使用六十四位浮点数。

fu main()
{
  let x=2.0;//f64
  let y:f32=3.0;//f32
}

3.其他类型

其他类型

此外,布尔型用bool表示;字符型用char表示。

复合类型

元组是用一对小括号()包括的一组数据,可以包含不同种类的数据。

        let tup:(i32,f64,u8,bool,char)=(500,6.4,1,true,'a');
        // tup.0 即500
        // tup.1 即6.4
        // tup.2 即1
        //以此类推即可

我们可以这样来使用元组

    let (x, y, z) = tup;
    println!("{} {} {}",x,y,z);

数组

在Rust中,我们依旧是用[]来表示数组,不过我们不需要规定其长度。

    let a=[1,2,3,4,5];//a是一个长度为5的整型数组
    let b=["asd","saddf"];//b是一个长度为2的字符串数组
    //数组的访问
    let c=a[0];
    let d=b[6];

总结:由于Rust语言如此表示类型,因此它是一种强类型语言。 

二.变量

必须声明的一点是,Rust是一门具有自动判断变量类型能力的强类型语言,它并不是一个弱类型语言。

2.1不可变变量

如果要声明一个变量,我们需要使用let关键字。例如:

let a=123;

 在声明了a变量之后,以下三行代码是被禁止的。

    let a=3;
    a='a';//不可行,字符不可赋值给整型
    a=4.56;//不可行,有精度缺失
    a=456;//不可行,a是个不可变变量。

前两个错误是很容易理解的,但是第三个错误很难理解,为什么a是一个不可变的变量?

这就牵扯到了Rust语言为了高并发安全而做的设计:

在语言层面尽量少的让变量可以改变,所以a的值不可变。

但这并不意味着a不是“变量”,官方文档中将其称为不可变变量。

那么,为什么Rust语言设置这种机制呢?

如果我们编写的程序的一部分在假设值永远不会改变的情况下运行,而我们代码的另一部分在改变该值,那么代码的第一部分可能就不会按照设计的意图去运转。由于这种原因造成的错误很难在事后找到。

2.2可变变量

那么,如何让变量可变呢?

这里,我们可以使用mut关键字。

    let mut a = 122; //被mut修饰的变量变得可变
    a = 456;
    println!("我是a,我的值是{}", a);

  

三.常量与不可变变量的区别

大家学习到了这里一定很奇怪常量和不可变变量的区别。

既然不可变变量是不可变的,那么它不就是常量吗?为什么叫变量?

变量和常量还是有区别的。在Rust中,他们的区别在于以下:

        let a = 123;   // 可以编译,但可能有警告,因为第一次定义的a变量没有被使用。
        let a = 456;   //这是一个新的a变量

但是,如果是常量的话,就无法通过编译。

    const a: i32 = 123;
    let a = 456;

 心细的人可能发现了一个问题,为什么我们可以取同名变量呢?

这是因为Rust允许在同一个作用域内对同名变量进行重定义,具体地说,这一个特性被称为变量屏蔽。变量屏蔽允许你用同一个作用域内使用相同的变量名来声明新的变量,而之前的变量会无效。

fn main() {
    let a = 123;   // 声明变量a并赋值为123
    println!("第一次a的值:{}", a);  // 使用变量a

    let a = 456;   // 再次声明变量a并赋值为456,遮蔽了之前的变量a
    println!("第二次a的值:{}", a);  // 使用新的变量a
}

四.重影

重影就是刚才讲述的所谓"变量屏蔽",现在我们详细的解释一下这个东西。

重影和可变变量的赋值是两个概念

重影是指用同一个名字重新表示另一个变量实体,其类型、可变属性和值都可以变化。

而赋值只能改变值。

fn main() {
    //重影的概念-->重影即刚刚说的变量屏蔽。
    let x = 5;
    let x = x + 1; //结合性左->右;先使用上一行代码中定义的x,之后将计算后的值赋值给新的x
    let x = x * 2; //同理,先x*2;之后再赋值给最新的x
    println!("The value of x is:{}", x);
    //需要注意的是,重影和可变变量的赋值不是一个概念
    //重影是同一个名字重新代表另一个变量实体,其类型、可变属性、值都可以发生变化。
    //赋值只能改变值
}

打印结果如下: 

下面我们来看一下地址:

  fn main()
  {
    //重影:变量的名称一样,但地址不一样。
    //重影的变量是多个不同的变量实体。
    let a=1;
    println!("第一个 'a' 的地址: {:p}", &a);
    let a=2;
    println!("第二个 'a' 的地址: {:p}", &a);
  }

 

五.常量

最后我们再来介绍一下常量

Rust 是一种静态类型的语言,这意味着变量的类型在编译时必须明确。虽然编译器在很多情况下能够推断出变量的类型,但对于常量来说,类型必须显式地指定,因为常量的值在编译时必须是已知的,而编译器无法像对待普通变量那样推断出其类型。

如果不指定类型,而且编译器无法推断出类型信息的话,编译器将会报错,指出缺少类型信息。

const a = 123; // 错误:缺少类型注解

 下面我们看一段可以推断出类型信息的代码

const A: i32 = 10; // 显式指定类型为 i32
const B = 20;      // 没有显式指定类型,但编译器可以推断为 i32
fn main() {
    let x = A + B; // 这里 x 的类型会被推断为 i32,因为 A 和 B 都是 i32
    println!("x = {}", x);
}

 但是,如果这段代码是这样子的,则无法通过编译

const B = 3; // error:没有类型注解,而且没有用到。无法推断类型

fn main() {
    // 这里没有用到常量 B
}

 关于常量的最后一个点是关于重影的。

     //常量不会被屏蔽,第二次再定义a不会屏蔽第一次定义的a
    const a:i32=123;
    let a=3;//error
    const a:i32=456;//error

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在 iPhone 上恢复已删除的短信

本文介绍如何检索已删除的短信和 iMessage 以及恢复丢失的消息。说明适用于 iOS 17 及更高版本。 如何在 iOS 17及更高版本中恢复文本 恢复已删除短信的最简单方法是使用 iOS 17。从删除短信到恢复它有 30 到 40 天的时间。 在“信息”的对话屏幕中,选择“过滤器”…

老旧机子装linux——Xubuntu

目录 前言 正文 下载系统 ​编辑 制作系统盘: 安装界面 Xubuntu ​编辑 lubuntu 后语 前言 有两台电脑,一台装了Ubuntu22,一台装了debuntu。虽然debuntu界面与乌班图大体一样,但是编译器好像有点区别。由于机子为10年前的老…

二分【1】二分查找框架 查找指定元素

目录 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身 2.查找第一个大于等于自己的 3.查找第一个大于自己的 4.严格递减序列 二。有重复元素 1.取其中第一个出现的 2.取其中最后一个出现的 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身…

【UML用户指南】-11-对高级结构建模-高级关系

目录 1、依赖(dependency) 1.1.1、绑定(bind) 1.1.2、导出(derive) 1.1.3、允许(permit) 1.1.4、实例(instanceOf) 1.1.5、实例化(instanti…

解锁俄罗斯市场:如何选择优质的俄罗斯云服务器

在当前云计算市场上,很多大型的云厂商并没有俄罗斯服务器的云节点,这给许多企业在拓展海外业务时带来了一定的困扰。然而,俄罗斯作为一个经济发展迅速的国家,其市场潜力不可忽视。因此,选择一台优质的俄罗斯云服务器成…

Docker搭建可道云

Docker搭建可道云(存储) 文章目录 Docker搭建可道云(存储)介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、搭建可道云私有云盘3.1、编写Dockerfile3.2、上传资源到指定目录3.3、查看目录下所有资源 四、构建镜像五、…

Java | Leetcode Java题解之第140题单词拆分II

题目&#xff1a; 题解&#xff1a; class Solution {public List<String> wordBreak(String s, List<String> wordDict) {Map<Integer, List<List<String>>> map new HashMap<Integer, List<List<String>>>();List<List…

HC05蓝牙模块与笔记本蓝牙连接

文章目录 1. 电脑和蓝牙模块连接 2. 串口软件调试 1. 电脑和蓝牙模块连接 HC05支持SPP协议&#xff0c;使用PC主机自带蓝牙&#xff0c;或者笔记本加蓝牙适配器。与HC05连接后&#xff0c;可在电脑端虚拟出串口&#xff0c;这样上位机软件就可以像操作串口一样与HC05通信。对…

Kafka监控系统efak的安装

下载地址Kafka Eaglehttp://download.kafka-eagle.org/下载地址连接不稳定&#xff0c;可以多次尝试直到成功连接下载 1.解压安装包并重命名 tar -zxvf kafka-eagle-bin-3.0.1.tar.gz 查看到解压后包含一个安装包&#xff0c;再解压 tar -zxvf efak-web-3.0.1-bin.tar.gz 移…

Spring Boot集成pmd插件快速入门Demo

1.什么是pmd插件&#xff1f; PMD 插件允许您在项目的源代码上自动运行PMD代码分析工具&#xff0c;并生成带有其结果的站点报告。它还支持与 PMD 一起分发的单独的复制/粘贴检测器工具&#xff08;或 CPD&#xff09;。 此版本的 Maven PMD 插件使用 PMD 6.42.0 并且需要 Jav…

在Java中使用SeleniumAPI,超详细

Java中 Selenium相关操作 1 定位元素 1.1 css选择器定位元素 就是定位到页面的元素&#xff0c;本质上就是一个一个的语法 下面举几个具体的例子&#xff1a; 类选择器 按照给定的 class 属性的值&#xff0c;选择所有匹配的元素。 语法&#xff1a;.classname 例子&am…

项目验收总体计划书(实际项目验收原件参考Word)

测试目标&#xff1a;确保项目的需求分析说明书中的所有功能需求都已实现&#xff0c;且能正常运行&#xff1b;确保项目的业务流程符合用户和产品设计要求&#xff1b;确保项目的界面美观、风格一致、易学习、易操作、易理解。 软件全套文档过去进主页。 一、 前言 &#xff0…

C++ | Leetcode C++题解之第140题单词拆分II

题目&#xff1a; 题解&#xff1a; class Solution { private:unordered_map<int, vector<string>> ans;unordered_set<string> wordSet;public:vector<string> wordBreak(string s, vector<string>& wordDict) {wordSet unordered_set(w…

一款免费文件夹同步工具,旨在帮助用户在不同磁盘或文件夹间进行文件和目录的复制、移动和同步工作

一、简介 1、一款免费文件夹同步工具&#xff0c;旨在帮助用户在不同磁盘或文件夹间进行文件和目录的复制、移动和同步工作。这款工具因其简单易用、高度可定制化的特点&#xff0c;受到了广大用户的青睐。SyncToy支持多种同步模式&#xff0c;包括镜像同步、单向同步以及增量同…

AbstractMap和SimpleEntry

一、AbstractMap 位置&#xff1a;在java.util包 二、SimpleEntry 1、概述 继承了Map中的内部接口Entry<K,V> SimpleEntry<K,V>不仅继承了Map.Entry<K,V>&#xff0c;还继承了序列化的接口 2、构造方法 方法说明SimpleEntry(K key,V value)通过键值对初…

2024 年最新 Python 基于百度智能云实现文字识别 OCR 详细教程

文字识别 OCR 概述 文字识别OCR&#xff08;Optical Character Recognition&#xff09;提供多场景、多语种、高精度的文字检测与识别服务&#xff0c;多项ICDAR指标居世界第一。广泛适用于金融服务、财税报销、法律政务、保险医疗、快递物流、交通出行、教育培训等场景&#…

STM32项目分享:智能台灯系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

接口自动化Requests+Pytest基础实现

目录 1. 数据库以及数据库操作1.1 概念1.2 分类1.3 作用 2 python操作数据库的相关实现2.1 背景2.2 相关实现 3. pymysql基础3.1 整个流程3.2 案例3.3 Pymysql工具类封装 4 事务4.1 案例4.2 事务概念4.3 事务特征 5. requests库5.1 概念5.2 角色定位5.3 安装5.4 校验5.5 reques…

一个公用的数据状态修改组件

灵感来自于一项重复的工作&#xff0c;下图中&#xff0c;这类禁用启用、审核通过不通过、设计成是什么状态否什么状态的场景很多。每一个都需要单独提供接口。重复工作还蛮大的。于是&#xff0c;基于该组件类捕获组件跳转写了这款通用接口。省时省力。 代码如下&#xff1a;…

Vue CLI 4与项目构建实战指南

title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置&#xff0c;提高开发效率&#xff0c;涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。 categories: 前端…