Rust 语言常见的一些概念(上)

这篇具有很好参考价值的文章主要介绍了Rust 语言常见的一些概念(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、变量的可变性

常量

 隐藏

2、数据类型

2.1 标量类型

整型

浮点型

数值运算

布尔型

字符类型

复合类型

元组类型

数组类型


1、变量的可变性

变量默认是不可改变的(immutable)。这是 Rust 提供给你的众多优势之一,让你得以充分利用 Rust 提供的安全性和简单并发性来编写代码。不过,你仍然可以使用可变变量。

接下来我们测试一下,使用 cargo new variables命令在 projects 目录生成一个叫做 variables的新项目。

修改main.rs,内容如下所示:

fn main() {
    let v = 1;
    v = 2;
    println!("Hello, world! {v}");
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

在VSCode中打开,我们发现rust-analyzer插件有提示,无法修改不可变变量。

不过可变性也是非常有用的,可以用来更方便地编写代码。尽管变量默认是不可变的,你仍然可以在变量名前添加 mut 来使其可变,代码改成如下所示:

fn main() {
    let mut v = 1;
    println!("Hello, world! {v}");
    v = 2;
    println!("Hello, world! {v}");
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

常量

类似于不可变变量,常量 (constants) 是绑定到一个名称的不允许改变的值,不过常量与变量还是有一些区别。

首先,不允许对常量使用 mut。常量不光默认不可变,它总是不可变。声明常量使用 const 关键字而不是 let,并且必须声明值的类型。

把上面代码改成如下所示:

fn main() {
    const PI: f64 = 3.14159;
    println!("Hello, world! {PI}");
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

 隐藏

在同一作用域内,可以多次声明一个变量,可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏,如下所示:

fn main() {
    let name = "zhangsan";
    let name = "lisi";
    println!("我的名字是:{name}");
    {
        let name = "wangwu";
        let name = "zhaoliu";
        println!("我的名字是:{name}");
    }
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

会打印对应的结果,但是重复定义的地方会有提示,说变量未引用,如果是有意为之的,建议加一个下划线的前缀。

隐藏与将变量标记为 mut 是有区别的。当不小心尝试对变量重新赋值时,如果没有使用 let 关键字,就会导致编译时错误。通过使用 let,我们可以用这个值进行一些计算,不过计算完之后变量仍然是不可变的。

mut 与隐藏的另一个区别是,当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字。例如,假设程序请求用户输入空格字符来说明希望在文本之间显示多少个空格,接下来我们想将输入存储成数字(多少个空格):

fn main() {
    let spaces = "zhangsan";
    let spaces = spaces.len();
    println!("长度是:{spaces}")
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

在编辑中可以看到同一个变量被赋值,对应的类型也改变了。

第一个 spaces 变量是字符串类型,第二个 spaces 变量是数字类型。隐藏使我们不必使用不同的名字,如果我们通过mut声明为可变变量,再看下会怎么样?

fn main() {
    let mut spaces = "zhangsan";
    spaces = spaces.len();
    println!("长度是:{spaces}");
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

这说明刚开始的时候,我们声明变量的类型已固定,我们不能改变变量的类型了。

2、数据类型

每一个值都属于某一个 数据类型data type),这告诉 Rust 它被指定为何种数据,以便明确数据处理方式。我们将看到两类数据类型子集:标量(scalar)和复合(compound)

使用 parse 将 String 转换为数字时,必须增加类型注解,像这样:

let guess:u32 = "100".parse().expect("");

如果没有对guess添加类型定义,会出现以下错误:

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

2.1 标量类型

标量scalar)类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。

整型

整数 是一个没有小数部分的数字。前面示例中使用过 u32 整数类型。该类型声明表明,它关联的值应该是一个占据 32 比特位的无符号整数(有符号整数类型以 i 开头而不是 u),以下表格展示了 Rust 内建的整数类型。

长度 有符号 无符号
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32
64-bit i64 u64
128-bit i128 u128
arch isize usize

isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的。

注意:可以是多种数字类型的数字字面值允许使用类型后缀,例如 57u8 来指定类型,同时也允许使用 _ 做为分隔符以方便读数,例如1_000,它的值与你指定的 1000 相同。

数字字面值 例子
Decimal (十进制) 98_222
Hex (十六进制) 0xff
Octal (八进制) 0o77
Binary (二进制) 0b1111_0000
Byte (单字节字符)(仅限于u8) b'A'

浮点型

Rust 也有两个原生的 浮点数floating-point numbers)类型,它们是带小数点的数字。Rust 的浮点数类型是 f32 和 f64,分别占 32 位和 64 位。默认类型是 f64,因为在现代 CPU 中,它与 f32 速度几乎一样,不过精度更高。所有的浮点型都是有符号的。

这是一个展示浮点数的实例:

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

浮点数采用 IEEE-754 标准表示。f32 是单精度浮点数,f64 是双精度浮点数。

数值运算

Rust 中的所有数字类型都支持基本数学运算:加法、减法、乘法、除法和取余。整数除法会向零舍入到最接近的整数。以下是一些示例:

fn main() {
    let plus = 2 + 3;
    let sub = 5 - 2;
    let mul = 2 * 3;
    let div = 3 /2;
    let rem = 3 % 2;
    println!("{plus} - {sub} - {mul} - {div} - {rem}") 
}

布尔型

Rust 中的布尔类型有两个可能的值:true 和 false。Rust 中的布尔类型使用 bool 表示。例如:

fn main() {
    let a = false;
    let b:bool = true;
    print!("{a} {b}")
}

字符类型

Rust 的 char 类型是语言中最原生的字母类型。下面是一些声明 char 值的例子:

fn main() {
    let a = 'A';
    let b:char = 'a';
    println!("{a} - {b}")
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

复合类型

复合类型可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。

元组类型

元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。

我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。这个例子中使用了可选的类型注解:

let tup: (char, f32, bool) = ('A', 3.2, true); 

tup 变量绑定到整个元组上,因为元组是一个单独的复合元素。为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值,像这样:

fn main() {
    let tup: (char, f32, bool) = ('A', 3.2, true); 
    let (x,y,z) = tup;
    println!("{x} {y} {z}") // A 3.2 true
}
数组类型

另一个包含多个值的方式是 数组array)。与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,Rust 中的数组长度是固定的。

fn main() {
    let x = [1, 2, 3, 4, 5];
}

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

你还可以通过在方括号中指定初始值加分号再加元素个数的方式来创建一个每个元素都为相同值的数组:

fn main() {
    let a = [3; 5];
}

变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与let a = [3,3,3,3,3]效果一样。

访问数组元素

fn main() {
    let x = [1, 2, 3, 4, 5];
    let y = x[0];
    let z = x[9];
    println!("{z}")
}

我们可以通过数组的索引去取值,跟js,ts语言取值一样。

当访问超过边界的索引时,会报一个运行时的错。

Rust 语言常见的一些概念(上),Rust,rust,开发语言,后端

程序在索引操作中使用一个无效的值时导致 运行时 错误。程序带着错误信息退出,并且没有执行最后的 println! 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。文章来源地址https://www.toymoban.com/news/detail-738323.html

到了这里,关于Rust 语言常见的一些概念(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust软件外包开发语言的特点

    Rust 是一种系统级编程语言,强调性能、安全性和并发性的编程语言,适用于广泛的应用领域,特别是那些需要高度可靠性和高性能的场景。下面和大家分享 Rust 语言的一些主要特点以及适用的场合,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公

    2024年02月12日
    浏览(37)
  • Rust之旅 - Rust概念、Windows安装、环境配置

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 [Java项目实战] 介绍Java组件安装、使用;手写框架等 [Aws服务器实战] Aws Linux服务器上操作nginx、git、JDK、Vue等 [Java微服务

    2024年01月22日
    浏览(33)
  • 【Rust】Rust学习 第八章常见集合

    Rust 标准库中包含一系列被称为  集合 ( collections )的非常有用的数据结构。大部分其他数据类型都代表一个特定的值,不过集合可以包含多个值。不同于内建的数组和元组类型,这些集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知,并且还可以随

    2024年02月13日
    浏览(27)
  • 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 本章节涵盖几乎所有编程语言会出现的概念以及他们在 Rust之中的工作原理,这不是 Rust 独有的,但我们将在 Rust 上下文中讨论他们,并且

    2024年02月10日
    浏览(29)
  • 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 本章节将讲解 Rust 独有的概念(所有权)。所有权是 Rust 最独特的特性,它使得 Rust 能够

    2024年02月10日
    浏览(32)
  • 遇到跨端开发或多项目开发时,遇到的一些问题探讨,后端开发语言如何选择?

    ​最近有同学问我,做后端开发项目时用php,java,c#,go,pathon...哪个好,从最近阿里云、美团服务器崩溃来看,我想给你最直接的回答是,没有完美的,只有适合自己的。咱们讨论最多的问题就是跨多端开发,以及多项目开发后期所带来的升级、维护等相关问题,接下来就

    2024年02月04日
    浏览(33)
  • Rust通用编程概念

    变量与可变性 在Rust中,声明变量使用let,并且默认情况下,声明的变量是不可变的,要使变量可变需要在声明变量时,在变量前面加上mut。如下: 如果将上述代码中的mut去掉,那么在编译代码时就会报错,报错结果就是不能对不可变的变量进行二次赋值

    2024年02月08日
    浏览(23)
  • Rust学习-通用编程概念

    静态类型(statically typed)的语言,必须在编译期知道所有变量的类型 允许使用类型后缀来指定类型,例如 57u8 数字字面量还可以使用 _ 作为可视分隔符以方便读数,如 1_000 使用 --release 参数进行发布(release)模式构建时,Rust 不检测会导致 panic 的整型溢出,Rust 会进行一种

    2024年02月13日
    浏览(25)
  • 有关 Rust 交叉编译的一些思路 (仅供参考)

    近来, 使用 Rust 语言开发的应用程序, 渐渐融入了开发者以及普通用户的日常生活. 它们不仅出现在我们常用的工作平台上, 不少嵌入式设备或者云服务器上也多见它们的身影. Rust 是一种需要编译的语言, 且一些 crate 仍需要 C/C++ 的构建环境. 大多数时候, 在 Rust 工具链 (toolchai

    2024年02月09日
    浏览(28)
  • 【rust/egui】(十)使用painter绘制一些图形—connections

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 在上一节我们使用 painter 绘制了一个可以拖拽的小方块,现在我们来用 painter 将两个小方块连接起来,类似这种: 首先我们需要在我们

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包