详解Rust的数据类型和语法

文章目录

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

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

基本数据类型

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

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

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

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

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

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

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

let a: char = 'a';
let emoji: char = 'b';

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

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

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

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

复杂数据类型

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

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++的枚举更多用于表示固定集合的简单值。

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)等,用于存储多个值。

//动态数组
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字符序列。

//创建和修改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编码的内存。它是不可变的,通常用于处理程序中已存在的字符串。

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关键字来声明可变变量。

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

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

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

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

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循环

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来借用可变引用。所有权和借用体系是一个很复杂的系统,这里只做简单介绍,后续会详细介绍相关的语法。

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.rhkb.cn/news/474430.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

任务管理功能拆解——如何高效管理项目任务?

在项目管理中&#xff0c;任务管理功能不仅仅是一个操作工具&#xff0c;它是确保项目按时、高效完成的核心所在。无论是小团队还是跨部门合作&#xff0c;任务管理能够帮助项目经理和团队成员清晰地看到每一项任务的执行情况和进度&#xff0c;从而合理调配资源、优化工作流程…

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的&#xff0c;当然&#xff0c;我肯定是很多年的计算机基础的&#xff0c;万变不离其宗。 现在web网站都流行所谓的前后端结构&#xff0c;不知不觉我也开始受到这个影响&#xff0c;以前都是前端直接操作…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…

深入解析大带宽服务器:性能优势与选择指南

一、大带宽服务器是什么&#xff1f; 大带宽服务器指的是具备高网络带宽能力的服务器&#xff0c;通常提供1Gbps、10Gbps甚至更高的网络连接能力。与普通带宽服务器相比&#xff0c;大带宽服务器能够在更短时间内传输大量数据&#xff0c;因此常用于高流量、高并发需求的场景&…

关于Qt C++中connect的几种写法

目录 1. 传统的槽函数写法 2. 使用函数指针的connect写法&#xff08;5.0&#xff09; 3. Lambda表达式作为槽函数&#xff08;C11&#xff09; 4.使用QOverload选择重载信号的写法 这connect函数就像是编程世界里的“茴”字&#xff0c;千变万化&#xff0c;各有千秋。咱们…

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型&#xff1a;路由器、交换机、防火墙、无线控制器 默认用户名&#xff1a;cisco 默认密码&#xff1a;cisco 设备类型&#xff1a;网管型交换机 默认用户名&#xff1a;admin 默认密码&#xff1a;admin 02 华…

elasticsearch是如何实现master选举的?

大家好&#xff0c;我是锋哥。今天分享关于【elasticsearch是如何实现master选举的&#xff1f;】面试题。希望对大家有帮助&#xff1b; elasticsearch是如何实现master选举的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…

讯飞、阿里云、腾讯云:Android 语音合成服务对比选择

在 移动端 接入语音合成方面&#xff0c;讯飞和腾讯云等都是优秀的选择&#xff0c;但各有其特点和优势。咱们的需求是需要支持普通话/英语/法语三种语言&#xff0c;以下是对各个平台的详细比较&#xff1a; 一、讯飞语音合成介绍 与语音听写相反&#xff0c;语音合成是将一段…

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…

使用 JavaScript 制作 To-Do List

使用 JavaScript 制作 To-Do List 本文记录了使用 HTML、CSS 和 JavaScript 制作一个简单的 To-Do List 网页的全过程&#xff0c;包含功能描述、代码实现以及优化方向。 **&#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的…

HarmonyOs鸿蒙开发实战(16)=>沉浸式效果第一种方案一窗口全屏布局方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 2.窗口全屏布局方案介绍 调整布局系统为全屏布局&#xff0c;界面元素延伸到状态栏和导航条区域实现沉…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中&#xff0c;使用MyBatis-Plus通过创建的实体类对数据库的操作过程中&#xff0c;通过实体创建数据库表是没有问题的&#xff0c;而在接口调用服务类操作数据库的时候&#xff0c;会出现报错。报错详情如下&#xff1a; 服务请求异…

高效工具推荐:基于WebGPU的Whisper Web结合内网穿透远程使用指南

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

力扣-Mysql-3322- 英超积分榜排名 III(中等)

一、题目来源 3322. 英超积分榜排名 III - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;SeasonStats --------------------------- | Column Name | Type | --------------------------- | season_id | int | | team_id …

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况 2024/11/16 13:42 缘起&#xff1a;最近需要通过iperf3打流&#xff0c;因此在ubuntu20.04服务器上常开sudo nethogs监控流量。 但是发现一个异常&#xff0c;ubuntu20.04服务器上发送的流量过大…

Stable Diffusion最全提示词写法教程

基础书写规则 所有单词都是通过英文书写&#xff0c;单词之间通过, 分割&#xff0c;注意是英文逗号&#xff1b;提示词之间是可以已通过换行书写的&#xff0c;并不会有什么影响&#xff1b;单个提示词的权重是1 , 默认情况下&#xff0c;越往前&#xff0c;权重越大&#xf…

TON商城与Telegram App:生态融合与去中心化未来的精彩碰撞

随着区块链技术的快速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为了数字生态的重要组成部分。而Telegram作为全球领先的即时通讯应用&#xff0c;不仅仅满足于传统的社交功能&#xff0c;更在区块链领域大胆探索&#xff0c;推出了基于其去中心化网络的…

Altenergy电力系统 status_zigbee SQL注入漏洞复现(CVE-2024-11305)

0x01 产品描述&#xff1a; Altenergy‌是一家专注于微型逆变器控制软件的公司&#xff0c;Altenergy电力系统控制软件是Altenergy电力系统公司的一款微型逆变器控制软件。 0x02 漏洞描述&#xff1a; Altenergy电力系统 status_zigbee接口处存在SQL注入漏洞&#xff0c;未经身…