Rust基础语法
以下是 Rust 语言基础语法的核心要点,结合与 JavaScript 的对比,帮助前端开发者快速掌握核心概念:
一、变量与常量
1. 变量声明
- Rust:变量默认不可变,需用
mut显式声明可变性。let x = 5; // 不可变变量 let mut y = 10; // 可变变量 y += 1; // 允许修改 - JavaScript 对比:
const x = 5; // 不可变常量 let y = 10; // 可变变量
2. 常量
- Rust:必须显式标注类型,命名风格全大写。
const MAX_POINTS: u32 = 100_000; // 使用下划线提高可读性 - JavaScript:
const MAX_POINTS = 100000;
二、数据类型
1. 标量类型(Scalar Types)
| 类型 | Rust 示例 | JavaScript 对比 |
|---|---|---|
| 整数 | i32, u64 | number(统一类型) |
| 浮点数 | f64 | number |
| 布尔 | bool | boolean |
| 字符 | char(如 'A',4字节) | string(如 'A') |
2. 复合类型(Compound Types)
-
元组(Tuple)
let tup: (i32, f64, &str) = (500, 6.4, "hello"); let (x, y, z) = tup; // 解构 println!("{}", tup.0); // 访问元素:500JavaScript 对比:无直接等价,近似数组解构:
const tup = [500, 6.4, "hello"]; const [x, y, z] = tup; -
数组(Array)
let arr = [1, 2, 3]; // 类型推断为 [i32; 3] let arr2: [i32; 5] = [0; 5]; // 初始化为 [0, 0, 0, 0, 0] println!("{}", arr[0]); // 访问元素:1JavaScript 对比:
const arr = [1, 2, 3];
三、字符串
1. 两种字符串类型
String:堆分配,可变字符串。let mut s = String::from("hello"); s.push_str(", world!"); // 修改字符串&str:字符串切片(不可变引用),通常用于函数参数。let s = "hello"; // 类型为 &str
2. 与 JavaScript 的差异
- JavaScript 只有动态字符串类型(类似
String),无栈上切片概念。 - Rust 字符串是 UTF-8 编码,而 JavaScript 使用 UTF-16。
四、函数
1. 基本语法
// 函数定义(带返回值类型标注)
fn add(x: i32, y: i32) -> i32 {x + y // 无分号,隐式返回
}// 调用函数
let result = add(5, 3);
2. 与 JavaScript 对比
function add(x, y) {return x + y;
}
const result = add(5, 3);
3. 特殊语法
- 表达式 vs 语句:
Rust 中代码块({})是表达式,可返回值:let y = {let x = 3;x + 1 // 无分号,返回 4 };
五、控制流
1. 条件语句
let num = 6;
if num % 2 == 0 {println!("偶数");
} else {println!("奇数");
}// if 是表达式,可赋值
let result = if num > 5 { "大" } else { "小" };
2. 循环
loop:无限循环loop {println!("无限循环");break; // 手动退出 }whilelet mut count = 0; while count < 5 {println!("count = {}", count);count += 1; }forlet arr = [10, 20, 30]; for element in arr.iter() {println!("值: {}", element); }
3. 与 JavaScript 对比
- JavaScript 的
for...of类似 Rust 的for遍历迭代器:const arr = [10, 20, 30]; for (const element of arr) {console.log(`值: ${element}`); }
六、结构体(Struct)
1. 定义与使用
// 定义结构体
struct User {username: String,email: String,sign_in_count: u64,
}// 创建实例
let user1 = User {email: String::from("user@example.com"),username: String::from("user1"),sign_in_count: 1,
};// 修改可变实例
let mut user2 = User { /* ... */ };
user2.email = String::from("new@example.com");
2. 与 JavaScript 对比
- JavaScript 使用对象字面量:
const user1 = {email: "user@example.com",username: "user1",sign_in_count: 1 };
七、枚举(Enum)与模式匹配
1. 枚举定义
enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}
2. 模式匹配(match)
let msg = Message::Write(String::from("hello"));
match msg {Message::Quit => println!("退出"),Message::Move { x, y } => println!("移动到 ({}, {})", x, y),Message::Write(text) => println!("消息: {}", text),Message::ChangeColor(r, g, b) => println!("颜色: RGB({}, {}, {})", r, g, b),
}
3. 与 JavaScript 对比
- JavaScript 无原生枚举,常用对象模拟:
const Message = {Quit: Symbol("Quit"),Move: (x, y) => ({ type: "Move", x, y }),Write: (text) => ({ type: "Write", text }), };
八、错误处理
1. Result 类型
fn read_file(path: &str) -> Result<String, std::io::Error> {std::fs::read_to_string(path)
}// 使用 match 处理
match read_file("hello.txt") {Ok(content) => println!("内容: {}", content),Err(e) => println!("错误: {}", e),
}// 使用 ? 运算符简化(需在返回 Result 的函数内)
fn process_file() -> Result<(), std::io::Error> {let content = read_file("hello.txt")?;println!("内容: {}", content);Ok(())
}
2. 与 JavaScript 对比
- JavaScript 使用
try/catch:try {const content = fs.readFileSync("hello.txt", "utf8");console.log(`内容: ${content}`); } catch (e) {console.error(`错误: ${e}`); }
九、所有权与借用(核心概念)
1. 所有权规则
- 每个值有唯一所有者。
- 所有者离开作用域时,值被自动释放。
- 赋值、传参可能转移所有权(针对堆数据)。
2. 借用(引用)
let s1 = String::from("hello");
let len = calculate_length(&s1); // 不可变借用fn calculate_length(s: &String) -> usize {s.len()
}
十、练习建议
- Rustlings:通过小型练习巩固语法(GitHub 仓库)。
- 编写 CLI 工具:如文件内容统计、Markdown 转换器等。
- 对比实现:用 Rust 重写 JavaScript 中的简单函数(如数组排序、字符串处理)。
通过掌握这些基础语法,前端开发者可逐步适应 Rust 的静态类型系统和内存安全模型,为进一步学习高级特性(如异步编程、生命周期)打下坚实基础。
相关文章:
Rust基础语法
以下是 Rust 语言基础语法的核心要点,结合与 JavaScript 的对比,帮助前端开发者快速掌握核心概念: 一、变量与常量 1. 变量声明 Rust:变量默认不可变,需用 mut 显式声明可变性。let x 5; // 不可变变量 le…...
如何将 Java 应用做成 EXE 的可执行软件
目录 前言一、情景介绍二、实现步骤1. 打 Jar 包2. 编写 bat 批处理文件3. bat 转 exe 前言 最近使用 GUI 帮朋友写了一个软件,为了方便他处理工作上的重复性且很麻烦的事情,程序是使用 Java 写的,就不得不面对一个问题:我必须将…...
第一篇:系统分析师首篇
目录 一、目标二、计划三、完成情况1.宏观思维导图2.过程中的团队管理和其它方面的思考 四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复…...
自动关机监控器软件 - 您的电脑节能助手
## 自动关机监控器 - 您的电脑节能助手 自动关机监控器是一款基于Python开发的实用工具,旨在帮助用户节省电力资源并延长电脑使用寿命。该程序通过监控用户的鼠标和键盘活动,在设定的无活动时间后自动关闭计算机,特别适合需要长时间离开电脑但…...
线程概念与控制(中)
线程概念与控制(上)https://blog.csdn.net/Small_entreprene/article/details/146464905?sharetypeblogdetail&sharerId146464905&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们经过上一篇的学习,接…...
K8S学习之基础六十二:helm部署memcached服务
helm部署memcached服务 #安装memcached的Chart docker load -i memcache_1_4_36.tar.gz #如果k8s用的是docker做容器运行时,用docker load -i导出镜像 ctr -nk8s.io images import memcache_1_4_36.tar.gz #如果k8s用的是containerd做容器运行时,用ctr…...
CPU 超线程技术以及如何关闭CPU超线程功能
CPU超线程技术介绍 CPU 超线程技术(Hyper-Threading Technology,HT)是英特尔提出的一种同时多线程(Simultaneous Multi-Threading, SMT)实现方式,其核心思想是通过逻辑层面的优化,让单个物理…...
Redis 源码硬核解析系列专题 - 第二篇:核心数据结构之SDS(Simple Dynamic String)
1. 引言 Redis没有直接使用C语言的标准字符串(以\0结尾的字符数组),而是自定义了SDS(Simple Dynamic String)。SDS是Redis的基础数据结构之一,广泛用于键值存储、命令参数等场景。本篇将深入剖析SDS的实现原理、优势以及源码细节。 2. 为什么不用C标准字符串? C字符串…...
1--当「穷举」成为艺术:CTF暴力破解漏洞技术从入门到入刑指南(知识点讲解版)
当「穷举」成为艺术:CTF暴力破解漏洞技术从入门到入刑指南 引言:论暴力破解的哲学意义 “世界上本没有漏洞,密码设得简单了,便成了漏洞。” —— 鲁迅(并没有说过) 想象你是个不会撬锁的小偷,面…...
DHCP报文的详细流程
在DHCP协议的工作流程中,Discover和Request报文使用广播MAC地址,而Offer和ACK报文通常使用单播MAC地址。这种差异源于DHCP协议的设计逻辑和网络通信的实际需求,具体原因如下: 1. DHCP报文交互流程 DHCP的完整流程分为四个阶段…...
通信协议和特征
文章目录 双工时钟电平串并行 双工 全双工:全双工通信允许同一时刻数据在两个方向上同时进行传输。一般来说,全双工的通信都有两根数据线,一根发送,一根接收,二者互不影响。半双工:允许数据在两个方向上传…...
Python 循环全解析:从语法到实战的进阶之路
一、问答题 (1)下面的循环体被重复了多少次?每次循环的输出结果是什么? i1 while i < 10:if i % 2 0:print(i)死循环,没有输出结果 i1 while i < 10:if i % 2 0:print(i)i l死循环,没有输出结果 i 1 while i< 10…...
The Rust Programming Language 学习 (七)
常见集合 使用 Vector 存储表 Vec<T>,也被称为 vector。vector 允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。vector 只能储存相同类型的值。它们在拥有一系列项的场景下非常实用 新建Vector 为了创建一…...
[GXYCTF2019]禁止套娃1 [GitHack] [无参数RCE]
Git基础 Git信息泄露原理解析及利用总结 - FreeBuf网络安全行业门户 CTF中的GIT泄露_ctf git泄露-CSDN博客 Git结构 dirsearch扫出来一大堆东西(然而这些并没有什么屁用) 但也算起码了解了git结构了吧 /.git/HEAD:表示当前HEAD指针的指…...
从ChatGPT到AutoGPT——AI Agent的范式迁移
一、AI Agent的范式迁移 1. ChatGPT的局限性与Agent化需求 单轮对话的“工具属性” vs. 多轮复杂任务的“自主性” ChatGPT 作为强大的生成式AI,虽然能够进行连贯对话,但本质上仍然是“工具型”AI,依赖用户提供明确的指令,而无法自主规划和执行任务。 人类介入成本过高:提…...
stock-pandas,一个易用的talib的替代开源库。
原创内容第841篇,专注智能量化投资、个人成长与财富自由。 介绍一个ta-lib的平替——我们来实现一下,最高价突破布林带上轨,和最低价突破布林带下轨的可视化效果: cross_up_upper stock[high].copy()# cross_up_upper 最高价突破…...
Spring Cloud Gateway详细介绍简单案例
文章目录 1、Spring Cloud Gateway 详细介绍1.1. 统一入口(Single Entry Point)1.2. 请求路由(Request Routing)1.3. 负载均衡(Load Balancing)1.4. 流量控制(Rate Limiting)1.5. 身…...
鸿蒙原生开发之状态管理V2
一、ArkTS状态变量的定义: State:状态,指驱动UI更新的数据。用户通过触发组件的事件方法,改变状态数据。状态数据的改变,引起UI的重新渲染。 在鸿蒙原生开发中,使用ArkTS开发UI的时候,我们可以…...
矩阵中对角线的遍历问题【C++】
1,按对角线进行矩阵排序 题目链接:3446. 按对角线进行矩阵排序 - 力扣(LeetCode) 【题目描述】 对于一个m*n的矩阵grid,要求对该矩阵进行 变换,使得变换后的矩阵满足: 主对角线右上的所有对角…...
Python小练习系列 Vol.4:迷宫寻路(回溯 + DFS)
🧠 Python小练习系列 Vol.4:迷宫寻路(回溯 DFS) 🚪 本期我们将探索一个二维世界,借助回溯算法帮助角色走出迷宫!这是学习路径搜索类题目的经典案例。 🧩 一、题目描述 给定一个二维…...
[Lc4_dfs] 解数独 | 单词搜索
目录 1.解数独 题解 2.单词搜索 题解 1.解数独 链接:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线…...
day17 学习笔记
文章目录 前言一、数组的增删改查1.resize函数2.append函数3.insert函数4.delete函数5.argwhere函数6.unique函数 二、统计函数1.amax,amin函数2.ptp函数3.median函数4.mean函数5.average函数6.var,std函数 前言 通过今天的学习,我掌握了num…...
自动语音识别(ASR)技术详解
语音识别(Automatic Speech Recognition, ASR)是人工智能和自然语言处理领域的重要技术,旨在将人类的语音信号转换为对应的文本。近年来,深度学习的突破推动语音识别系统从实验室走入日常生活,为智能助手、实时翻译、医…...
git | 版本切换的相关指令
常见指令 git log --oneline #查看历史提交 git tag latest-backup # 对当前的提交进行标记,标记名为latest-backup git checkout -b old-version 55b16aa # 切换到[55b16aa]的提交中,并标记为[old-version]的分支 git checkout master …...
19.OpenCV图像二值化
OpenCV图像二值化 图像二值化(Binarization)是图像预处理中的一种常用技术,其目的是将图像中的像素值分为两个类别——通常是“前景”和“背景”或者说0和255。二值化能够简化图像信息,为后续的形态学处理、边缘检测、目标识别等…...
通过Appium理解MCP架构
MCP即Model Context Protocol(模型上下文协议),是由Anthropic公司于2024年11月26日推出的开放标准框架,旨在为大型语言模型与外部数据源、工具及系统建立标准化交互协议,以打破AI与数据之间的连接壁垒。 MCP架构与Appi…...
分享一个Pyside6实现web数据展示界面的效果图
今天又是有问题直接找DS的一天,每日一问,今天我的问题是“怎么将pyside6生成的界面转成web界面,使用python语言实现web界面”,等了一会,DS给我提供了两种方案,方案如下: 然后,让我们…...
FALL靶场通关攻略
1,下载好靶机后打开,通过kali扫描靶机ip和端口,得到靶机ip为192.168.50.144 2,扫描目录 3,访问靶机 4,访问扫描到的test.php,得到缺少GET请求参数的提示 5,使用FUZZ来扫出参数为file 6ÿ…...
Mybatis日志模块分析--适配器模式+代理模式
适配器模式 日志在我们开发过程中占据了一个非常重要的地位,是开发和运维管理之间的桥梁,在Java中的日志框架也非常多,Log4j,Log4j2,Apache Commons Log,java.util.logging,slf4j等,这些工具对外的接口也都不尽相同,为…...
HTTP介绍以及(GET/POST/PUT/DELETE)应用介绍
WWW 是 “World Wide Web” 的缩写,中文名为 “万维网”。它是一个基于超文本和 HTTP 协议的全球性信息系统,通过互联网连接了世界各地的服务器和用户。用户可以使用浏览器访问各种网站,浏览网页、获取信息、进行交互等。 WWW 的核心技术包…...
