详解Rust的数据类型和语法

embedded/2024/11/22 9:49:11/

文章目录

    • 基本数据类型
    • 复杂数据类型
    • 字符串
    • 基本语法

Rust是一种强调安全性和性能的系统编程语言。它的设计目标之一是防止内存安全错误同时提供丰富的功能和灵活的语法。下面介绍一下Rust语言的基本数据类型和语法

基本数据类型

1.整数类型
有符号整数: i8, i16, i32, i64, i128, isize(指针大小的有符号整数)
无符号整数: u8, u16, u32, u64, u128, usize(指针大小的无符号整数)

rust">let x: i32 = 123;      // 有符号32位整数
let y: u64 = 456;      // 无符号64位整数

2.浮点类型
Rust提供了两种基本的浮点型数据f32和f64,分别对应单精度和双精度浮点数。

rust">let f: f32 = 1.23;     // 单精度浮点数
let d: f64 = 3.14159;  // 双精度浮点数

3.布尔类型
布尔类型bool有两个可能的值: true 和 false

rust">let is_active: bool = true;
let is_greater: bool = 10 > 5;

4.字符类型
Rust的字符类型(char)代表一个Unicode标量值

rust">let a: char = 'a';
let emoji: char = 'b';

5.数组类型
数组是多个相同类型值的集合,数组在Rust中的大小是固定的。

rust">let arr: [i32; 5] = [1, 2, 3, 4, 5];
let first = arr[0];   // 访问第一个元素
let second = arr[1];  // 访问第二个元素

6.切片类型
切片类型允许开发者引用数组的一部分。切片是动态大小的,可以在运行时用来表示数组的一段连续区间。

rust">let a = [1, 2, 3, 4, 5];
//包含左边界不包含右边界  
let slice = &a[1..3];  // 切片 包括索引1和2,不包括3

复杂数据类型

1.结构体(Structs)
结构体是一种创建自定义数据类型的方式,用于封装多个相关的值。

rust">struct Person {name: String,age: u32,
}
let person = Person {name: String::from("Alice"),age: 30,
};

2.枚举(Enums)
枚举是一种定义可能的变量集合的类型,非常适合处理多种类型的情况。

Rust的枚举类型和C++的枚举类型功能差异还是比较大的,Rust的枚举能够携带数据和创建复杂的数据结构,而C++的枚举主要用于定义一组整型常数。Rust的枚举非常适合用于错误处理(通过Result和Option类型)、状态机、复杂数据结构的构建,而C++的枚举更多用于表示固定集合的简单值。

rust">enum WebEvent {PageLoad,PageUnload,KeyPress(char),Click { x: i64, y: i64 },
}
let pressed = WebEvent::KeyPress('x');
let clicked = WebEvent::Click { x: 20, y: 80 };

3.元组(Tuples)
元组是一个可以包含多种类型的固定大小的有序列表,且长度固定。

let tuple: (i32, String, f64) = (500, String::from("hello"), 0.5);
let (x, y, z) = tuple;  // 解构
println!("The value of y is: {}", y);

4.集合(Collections)
Rust提供了几种标准库中的集合类型,如动态数组(Vec)、哈希映射(HashMap)、集合(HashSet)等,用于存储多个值。

rust">//动态数组
let mut vec = Vec::new();
vec.push(1);
vec.push(2);
vec.push(3);//哈希映射使用
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);

字符串

Rust中的字符串可以分为两大类:String和str

1.String类型
String是一个可增长、可变、拥有所有权的UTF-8字符序列。

rust">//创建和修改String:
let mut s = String::new();//从字面量创建String
let data = "initial contents";
let s = data.to_string();//直接使用字面量
let s = String::from("initial contents");//添加内容到String
s.push_str("more contents");
s.push('!');  // 添加单个字符  

2.str类型
str通常以借用形式出现为&str,是一个固定大小的字符串slice,指向一段UTF-8编码的内存。它是不可变的,通常用于处理程序中已存在的字符串。

rust">let s: &str = "Hello, world!";
//拼接字符串
let mut s = String::from("Hello");
s += " world!";
//使用 push_str
s.push_str(" Nice to meet you!");
//获取字符串的长度
let len = s.len();
//遍历字符串中的字符  
for c in "hello".chars() {println!("{}", c);
}
// 输出每个字符
for b in "world".bytes() {println!("{}", b);
}
// 输出每个字节  
let hello = "Здравствуйте";
let s = &hello[0..4];  // "Зд",每个字符2字节
// 格式化字符串  
let s = format!("{}-{}", "hello", "world");

基本语法

1.变量和可变性
默认情况下,Rust的变量是不可变的。使用mut关键字来声明可变变量。

rust">let x = 5;       // 不可变变量
let mut y = 10;  // 可变变量
y = 20;

2.定义函数
使用fn关键字定义函数,函数参数需要声明类型,返回值类型用->指定。
Rust支持表达式(没有;结尾)和语句(有;结尾)。

rust">fn add(x: i32, y: i32) -> i32 {x + y  // 这是一个表达式,不需要分号
}

3.控制流程
条件语句使用if,可选的else if和else,支持表达式

rust">let number = 6;
if number % 4 == 0 {println!("Number is divisible by 4");
} else if number % 3 == 0 {println!("Number is divisible by 3");
} else {println!("Number is not divisible by 3 or 4");
}

loop、while和for循环

rust">fn main() {let mut n = 0;//while循环  while n <= 5  {println!("{}!", n);n = n + 1;}//loop无条件循环  loop {if n > 5 {break}println!("{}", n);n+=1;}//for枚举循环  let array = [10, 20, 30, 40];for element in array.iter() {println!("Element: {}", element);}
}

4.所有权(Ownership)、借用(Borrowing)、引用(References)
Rust的所有权系统是其安全性和内存管理的基础。通常一个值有一个所有者,当所有者超出作用域时,值被丢弃。使用&符号来引用一个值,并用&mut来借用可变引用。所有权和借用体系是一个很复杂的系统,这里只做简单介绍,后续会详细介绍相关的语法

rust">fn main() {let s1 = String::from("hello");let len = calculate_length(&s1);println!("The length of '{}' is {}.", s1, len);
}fn calculate_length(s: &String) -> usize {s.len()
}

http://www.ppmy.cn/embedded/139586.html

相关文章

设计模式:4、命令模式(双重委托)

目录 0、定义 1、命令模式包括四种角色 2、命令模式的UML类图 3、代码示例 0、定义 将一个请求封装为一个对象&#xff0c;从而使用户可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 1、命令模式包括四种角色 接…

【Docker容器】一、一文了解docker

1、什么是docker&#xff1f; 1.1 docker概念 Docker是一种容器化平台&#xff0c;通过使用容器技术&#xff0c;Docker允许开发人员将应用程序和其依赖项打包到一个独立的、可移植的容器中。每个容器具有自己的文件系统、环境变量和资源隔离&#xff0c;从而使应用程序可以在…

解决复杂查询难题:如何通过 Self-querying Prompting 提高 RAG 系统效率?

在现代自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;检索增强生成&#xff08;RAG&#xff09;系统因其能够结合外部知识库和大语言模型的强大生成能力&#xff0c;成为了提升信息检索质量的主流解决方案之一。然而&#xff0c;传统的 RAG 流程存在诸多挑战&#x…

Matlab深度学习(一)——如何构建一个卷积神经网络

1.1 CNN的核心 —— 卷积 我们以二维滑动卷积着重说明。与我们的滑动窗异常值检测类似&#xff0c;但滑动卷积涉及三个矩阵&#xff1a;第一个矩阵通常尺寸大且固定不动&#xff0c;在这称之为“输入矩阵”&#xff1b;第二个矩阵尺寸小&#xff0c;在输入矩阵上以从左到右&…

韩顺平 一周学会Linux | 第9章 Linux 实操篇-实用指令

一、指定运行级别 二、找回 Root 密码 三、帮助指令 四、文件目录类 五、时间日期类 1. date 指令-显示当前日期 date 功能描述&#xff1a;显示当前时间date %Y 功能描述&…

量子蚁群算法复现

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月21日13点04分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

VSCode 新建 Python 包/模块 Pylance 无法解析

问题描述&#xff1a; 利用 VSCode 写代码&#xff0c;在项目里新建一个 Python 包或者模块&#xff0c;然后在其他文件里正常导入这个包或者模块时出现&#xff1a; Import “xxxx” could not be resolved Pylance (reportMissingImports) 也就是说 Pylance 此时无法解析我们…

SpringMVC应用专栏介绍

专栏导读 在当今快速发展的互联网时代&#xff0c;SpringMVC作为Java开发中的核心框架之一&#xff0c;已经成为构建企业级Web应用的首选技术。本“SpringMVC应用”专栏旨在为读者提供一个全面深入的学习平台&#xff0c;帮助读者掌握SpringMVC的精髓&#xff0c;提升Web开发能…