Rust基本类型

数值类型

整数类型
  • 无符号整数只能取正数和0,有符号整数可以取正数负数和0。
  • isize和usize类型取决于程序运行的计算机CPU类型,若CPU是32位的,则这两个类型是32位的,若CPU是64位的,则它们是64位的。
  • rust整型 默认使用 i32,例如 let i = 1; 那 i 就是 i32类型。
  • 整型溢出
    • 假设有一个 u8 ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生整型溢出。
    • debug模式 编译下,若存在整形溢出,则程序在编译时因错误而退出。
    • 当使用 --release 参数进行release 模式构建时,rust检测整型溢出,当检测到整型溢出时,rust会按照补码循环溢出,例如在 u8 情况下,256变成0,257变成1。程序不会因错误而退出,但是可能不是你所期望的值。
    • 要显式的处理可能的溢出,可以使用标准库针对原始数字类型提供的这些方法:
      • 使用wrapping_*方法在所有模式下都按照补码循环溢出规则处理。例如 wrapping_add
      • 如果使用checked_*方法时发生溢出,则返回 None 值
      • 使用overflowing_*方法返回该值和一个指示是否存在溢出的布尔值
      • 使用saturating_*方法,可以限定计算后的结果不超过目标类型的最大值或低于最小值
      • 以下是一个示例代码,然后cargo run 命令运行代码如下
fn main() {
    let a: i32 = 2147483647;  //整型溢出
    let b: i32 = 10;


    //wrapping_add
    let wrapping_result = a.wrapping_add(b);  //简单的相加操作,a+b
    println!("Wrapping Add Result: {}", wrapping_result);

    //checked_add··············
    match a.checked_add(b) {
        Some(result) => println!("Checked Add Result: {}", result),
        None => println!("Checked Add Overflowed"),
    }

    // overflowing_add
    let (overflowing_result, did_overflow) = a.overflowing_add(b);
    println!("Overflowing Add Result: {}", overflowing_result);
    println!("Did Overflow: {}", did_overflow);

    // saturating_add
    let saturating_result = a.saturating_add(b);
    println!("Saturating Add Result: {}", saturating_result); 
}

在这里插入图片描述

浮点类型
  • Rust 中浮点类型数字有两种基本类型: f32 和 f64,分别为 32 位(单精度)和 64 位(双精度)大小。默认浮点类型是 f64,在现代的 CPU 中它的速度与 f32 几乎相同,但精度更高。
  • 但是浮点数是我们想要数字的近似表达,因此需要避免在浮点数上测试相等性,当结果在数学上可能存在未定义时,需要格外的小心。
NaN
  • 对于数学上未定义的结果会产生一个特殊的结果NaN,所有跟NaN交互的操作都会返回一个NaN,而且NaN不能用来比较,可以使用is_nan()等方法来判断一个数值是否是NaN,如下
fn main() {
    let x = (-42.0_f32).sqrt();
    if x.is_nan() {
        println!("未定义的数学行为")
    }
}
数字运算

Rust 支持所有数字类型的基本数学运算:加法、减法、乘法、除法和取模运算。跟正常的数学运算一样。

位运算
  • rust位运算基本上和其它语言一样。
  • 示例代码
fn main() {
    // 二进制为00000010
    let a:i32 = 2;
    // 二进制为00000011
    let b:i32 = 3;

    println!("(a & b) value is {}", a & b);

    println!("(a | b) value is {}", a | b);

    println!("(a ^ b) value is {}", a ^ b);

    println!("(!b) value is {} ", !b);

    println!("(a << b) value is {}", a << b);

    println!("(a >> b) value is {}", a >> b);

    let mut a = a;
    // 注意这些计算符除了!之外都可以加上=进行赋值 (因为!=要用来判断不等于)
    a <<= b;
    println!("(a << b) value is {}", a);
}

运行结果如下
在这里插入图片描述

序列
  • rust提供了非常简洁的方式来生成连续的数值,例如1..5,生成从1到4的连续数字,不包含5,常用于循环当中,序列只允许用于数字或字符类型,例如:
fn main() {
   for i in 1..=5 {
    println!("{}",i);
   }
}

运行如下

有理数和复数
  • rust标准库中不包含有理数和复数,但社区已经开发出高质量的rust数值库,可以按以下步骤来引入num库:
    • 创建新工程cargo new complex-num 然后 cd complex-num
    • Cargo.toml中的[dependencies]下添加一行num = "0.4.0"
    • src/main.rs文件中的main函数替换为下面的代码
    • 运行cargo run
use num::complex::Complex;

fn main() {
    let a = Complex { re: 2.1, im: -1.2};
    let b = Complex::new(11.1, 22.2);
    let result = a + b;

    println("{} + {}i", result.re, result.im)
}

字符类型(char)

  • Rust语言中的字符不仅仅是ASCII,所有的Unicode值都可以作为Rust字符,包括单个的中文、日文、韩文、emoji表情符号等等都是合法的字符类型。由于Unicode都是四个字节编码,因此字符类型也是占用四个字节。

布尔类型(bool)

  • Rust中的布尔类型有true和false两个可能的值,站内存大小为一个字节。使用布尔类型的场景主要在于流程控制。

单元类型

  • 单元类型就是(),唯一的值也是(),例如fn main(),main函数就是返回这个单元类型(),例如常见的println!()的返回值也是单元类型()。不占用任何内存。

语句和表达式

  • Rust的函数体是由一系列的语句组成,最后由一个表达式来返回值,如下
fn add_with_extra(x: i32, y: i32) -> i32 {
    let x = x + 1; // 语句
    let y = y + 5; // 语句
    x + y // 表达式
}

语句

  • 语句完成一个具体的操作,但是不返回值,如下:
let a = 8;
let b: Vec<f64> = Vec::new();
let (a, c) = ("hi", false);

表达式

  • 表达式会进行求值,然后返回一个值,表达式可以称为语句的一部分,例如 let y = 6,6就是一个表达式。如果表达式不返回任何值,会隐式的返回一个(),函数没有返回值,那么返回一个(),通过;结尾的语句返回一个()。如下用花括号包裹起来最终返回一个值的语句块也是表达式:
fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

以下函数会隐式返回一个()

use std::fmt::Debug;

fn report<T: Debug>(item: T) {
  println!("{:?}", item);

}

以下函数会显式的返回一个()

fn clear(text: &mut String) -> () {
  *text = String::from("");
}

注意:表达式不能以分号结尾,否则就会从表达式变成一条语句,再也不会返回一个值。

函数

  • Rust函数跟其它语言几乎没什么区别,如下
fn add(i: i32, j: i32) -> i32 {
   i + j
 }

声明函数的关键字fn,函数名add(),参数ij,参数类型和返回值类型都是i32

函数要点

  • 函数名和变量名使用蛇形命名法,例如fn add_two() -> {}
  • 函数位置可以随便放,Rust不关心我们在哪里定义了函数,只要有定义即可。
  • Rust是强类型语言,因此需要为每一个函数参数标识它的具体类型。

函数返回

  • 在Rust中函数就是表达式,我们可以把函数的返回值直接赋给调用者。函数的返回值就是函数体最后一条表达式的值,也可以使用return提前返回
//这个函数返回表达式x+5的值
fn plus_five(x:i32) -> i32 {
    x + 5
}
//该函数若x>5,就提前返回x-5的值,跟其它语言差别不大
fn plus_or_minus(x:i32) -> i32 {
    if x > 5 {
        return x - 5
    }

    x + 5
}

fn main() {
    let x = plus_five(5);

    println!("The value of x is: {}", x);
}
  • 永远不返回的发散函数
    !用作函数返回类型的时候,表示该函数永远不返回,该语法往往用作会导致程序崩溃的函数:
fn dead_end() -> ! {
  panic!("你已经到了穷途末路,崩溃吧!");
}

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

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

相关文章

vue/uniapp项目把public下的静态资源打包进dist目录

vue-cli包装的uniapp项目&#xff0c;需要把public下的静态资源打包进dist目录下&#xff0c; 如下图所示 解决方法&#xff1a; 安装依赖&#xff1a;yarn add copy-webpack-plugin -D;根路径新建vue.config.js文件 vue.config.js配置如下&#xff1a; const CopyPlugin …

手机如何设置静态IP地址显示

随着移动互联网的普及&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。在连接无线网络时&#xff0c;我们有时需要设置手机的IP地址为静态&#xff0c;以满足特定的网络需求或解决某些网络问题。本文将指导您如何在手机上设置静态IP地址显示&#xff0c;让您更好地管…

C++语言学习(二)—— C++语言的基本知识

目录 一、面向对象的三个核心概念 二、C语言中的I/O口 三、C语言中的数据类型​​​​​​​ 3.1 逻辑类型 3.2 引用类型 3.2.1 引用作为函数参数 3.2.2 引用作为函数返回值 3.2.3 引用作为类成员 3.3 类类型 四、 C语言中的内联函数 五、 函数重载 六、 带默认形参…

【C++】狗屁不通文章生成器2.0

【C】狗屁不通文章生成器2.0 1 前言2 改进2.1 字词的前后关系2.2 文章生成系统 3 实现(部分)3.1 class wordpair3.1.1 转化为 json3.1.2 添加后缀词3.1.3 选择后缀词 3.2 class createArticle3.2.1文本分割3.2.2生成文章 4演示4.1 wordpair(3x2), 启动词(春天)4.2 wordpair(2x1…

2024.3.24 机器学习周报

目录 引言 Abstract 一、文献阅读 1、题目 2、引言 3、创新点 4、模型架构 4.1 Encoder and Decoder Stacks 4.2 Attention—注意力机制 5、实验 6、结果 二、Self-attention 1、什么是self-attention 2、例子&#xff08;x2→z2&#xff09; 3、矩阵批量处理 …

Linux--进程(1)

目录 前言 1.冯诺依曼体系结构 2. 操作系统(Operator System)--第一个被加载的软件 3.进程 3.1基本概念 3.2Linux中的PCB 3.3通过系统调用创建子进程-fork初识 fork&#xff1a;创建一个子进程 为什么要创建子进程&#xff1f; fork的原理&#xff1a; 进一步了解fo…

【Linux】调试器-gdb的使用说明(调试器的配置,指令说明,调试过程说明)

目录 00.背景 01.安装 02.生成调试信息 03.调试过程 00.背景 在软件开发中&#xff0c;通常会为程序构建两种不同的版本&#xff1a;Debug模式和Release模式。它们之间的区别主要在于优化级别、调试信息、错误检查等方面&#xff1a; 1.Debug 模式&#xff1a; 优化级别低…

灵境矩阵平台x百度---智能体(一)

什么是数据插件 大模型插件:大语言模型插件是随着大语言模型发展而诞生的全新插件。大语言模型插件的核心是Web API独立于大语言模型&#xff0c;插件开发过程不受大语言模型的约束&#xff0c;同时没有开发语言的限制&#xff0c;更加通用&#xff0c;只要WebAPI遵循RESTfuI相…

如何在 Odoo 17 的 齿轮菜单⚙️ 中添加新菜单

在 Odoo 中&#xff0c;齿轮菜单是一个重要组件&#xff0c;允许用户访问与系统内不同模型和功能相关的各种配置选项和设置。它通常由位于用户界面左上角的齿轮或齿轮图标表示。下图显示了 "sale.order "模型的齿轮菜单。 默认情况下&#xff0c;我们在 CogMenu 中提…

js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)

setTimeout 需手动控制频率&#xff0c;页面隐藏后仍会执行动画&#xff0c;更加耗费性能。 requestAnimationFrame 简称 RAF , 会在浏览器中每次刷新屏幕时调用一个函数&#xff0c;用于创建平滑的动画&#xff0c;因为它会自动适应屏幕的刷新率&#xff0c;无需手动控制频率。…

实战whisper语音识别第一天,部署服务器,可远程访问,实时语音转文字(全部代码和详细部署步骤)

Whisper是OpenAI于2022年发布的一个开源深度学习模型&#xff0c;专门用于语音识别任务。它能够将音频转换成文字&#xff0c;支持多种语言的识别&#xff0c;包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下&#xff08;如不同的背景噪声水…

今天聊聊新零售

一、什么是新零售&#xff1f; 2016年&#xff0c;在杭州举行的“云栖大会”上&#xff0c;马云发表了讲话&#xff0c;首次提出了“新零售”这一概念。 1.1 新零售概念 新零售&#xff0c;英文是New Retailing&#xff0c;新零售是对人货场的重构。人是消费者、销售人员、…

C++的vector类(一):vector类的常见操作

目录 前言 Vector类 遍历与初始化vector ​vector的扩容机制 vector的对象操作 find与insert 对象数组 前言 string类中还有一些内容需要注意&#xff1a; STL 的string类怎么啦&#xff1f; C面试中string类的一种正确写法 C STL string的Copy-On-Write技术 C的st…

网络编程 - 套接字

1、预备知识 1.1、理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址&#xff1b; 思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分…

kafka面试篇

消息队列的作用&#xff1a;异步、削峰填谷、解耦 高可用&#xff0c;几乎所有相关的开源软件都支持&#xff0c;满足大多数的应用场景&#xff0c;尤其是大数据和流计算领域&#xff0c; kafka高效&#xff0c;可伸缩&#xff0c;消息持久化。支持分区、副本和容错。 对批处理…

使用ansible剧本进行lvm分盘

使用 Ansible 剧本&#xff08;Playbook&#xff09;进行 LVM 分区管理是一种自动化的方式&#xff0c;可以帮助管理员在多台主机上批量管理逻辑卷。 部署环境 3台主机&#xff0c;添加硬盘 ansible-galaxy collection install community.general 联网执行&#xff0c;下…

蓝桥杯算法心得——游戏(优先队列)

大家好&#xff0c;我是晴天学长&#xff0c;优先队列的题&#xff0c;式子化简非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .游戏 2) .算法思路 附近最小 1.接收数据 2.找出最小的&#…

docker 配置国内阿里镜像源

在/etc/docker/目录下新建daemon.json文件 在文件中写入 {"registry-mirrors": ["https://jmphwhtw.mirror.aliyuncs.com"] } 以管理员身份运行命令 systemctl daemon-reload systemctl restart docker

羊大师羊奶靠谱么?消费口碑深度讲解

羊大师羊奶靠谱么&#xff1f;消费口碑深度讲解 羊大师羊奶&#xff0c;作为羊奶市场的一颗璀璨明星&#xff0c;其靠谱性一直备受广大消费者的关注。那么&#xff0c;羊大师羊奶究竟靠不靠谱呢&#xff1f;这需要我们从品牌实力与消费口碑两个方面进行深度解析。 从品牌实力来…

小米相册提取表格选项消失解决方法

小米相册这次的提取表格选项消失 故障原因&#xff1a; 因为部分用户将小爱视觉&#xff08;原名扫一扫&#xff09;这个应用给卸载了导致 解决方法 应用商店下载 小爱视觉 安装后授权即可使用 注意&#xff1a;系统最好为最新的 Xiaomi HyperOS系统