Rust基础语法

news2025/3/31 19:34:01

以下是 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, u64number(统一类型)
浮点数f64number
布尔boolboolean
字符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); // 访问元素:500
    

    JavaScript 对比:无直接等价,近似数组解构:

    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]);         // 访问元素:1
    

    JavaScript 对比

    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;  // 手动退出
    }
    
  • while
    let mut count = 0;
    while count < 5 {
        println!("count = {}", count);
        count += 1;
    }
    
  • for
    let 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()
}

十、练习建议

  1. Rustlings:通过小型练习巩固语法(GitHub 仓库)。
  2. 编写 CLI 工具:如文件内容统计、Markdown 转换器等。
  3. 对比实现:用 Rust 重写 JavaScript 中的简单函数(如数组排序、字符串处理)。

通过掌握这些基础语法,前端开发者可逐步适应 Rust 的静态类型系统和内存安全模型,为进一步学习高级特性(如异步编程、生命周期)打下坚实基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将 Java 应用做成 EXE 的可执行软件

目录 前言一、情景介绍二、实现步骤1. 打 Jar 包2. 编写 bat 批处理文件3. bat 转 exe 前言 最近使用 GUI 帮朋友写了一个软件&#xff0c;为了方便他处理工作上的重复性且很麻烦的事情&#xff0c;程序是使用 Java 写的&#xff0c;就不得不面对一个问题&#xff1a;我必须将…

第一篇:系统分析师首篇

目录 一、目标二、计划三、完成情况1.宏观思维导图2.过程中的团队管理和其它方面的思考 四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 一、目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复…

自动关机监控器软件 - 您的电脑节能助手

## 自动关机监控器 - 您的电脑节能助手 自动关机监控器是一款基于Python开发的实用工具&#xff0c;旨在帮助用户节省电力资源并延长电脑使用寿命。该程序通过监控用户的鼠标和键盘活动&#xff0c;在设定的无活动时间后自动关闭计算机&#xff0c;特别适合需要长时间离开电脑但…

线程概念与控制(中)

线程概念与控制&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/146464905?sharetypeblogdetail&sharerId146464905&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们经过上一篇的学习&#xff0c;接…

[GXYCTF2019]禁止套娃1 [GitHack] [无参数RCE]

Git基础 Git信息泄露原理解析及利用总结 - FreeBuf网络安全行业门户 CTF中的GIT泄露_ctf git泄露-CSDN博客 Git结构 dirsearch扫出来一大堆东西&#xff08;然而这些并没有什么屁用&#xff09; 但也算起码了解了git结构了吧 /.git/HEAD&#xff1a;表示当前HEAD指针的指…

从ChatGPT到AutoGPT——AI Agent的范式迁移

一、AI Agent的范式迁移 1. ChatGPT的局限性与Agent化需求 单轮对话的“工具属性” vs. 多轮复杂任务的“自主性” ChatGPT 作为强大的生成式AI,虽然能够进行连贯对话,但本质上仍然是“工具型”AI,依赖用户提供明确的指令,而无法自主规划和执行任务。 人类介入成本过高:提…

stock-pandas,一个易用的talib的替代开源库。

原创内容第841篇&#xff0c;专注智能量化投资、个人成长与财富自由。 介绍一个ta-lib的平替——我们来实现一下&#xff0c;最高价突破布林带上轨&#xff0c;和最低价突破布林带下轨的可视化效果&#xff1a; cross_up_upper stock[high].copy()# cross_up_upper 最高价突破…

Spring Cloud Gateway详细介绍简单案例

文章目录 1、Spring Cloud Gateway 详细介绍1.1. 统一入口&#xff08;Single Entry Point&#xff09;1.2. 请求路由&#xff08;Request Routing&#xff09;1.3. 负载均衡&#xff08;Load Balancing&#xff09;1.4. 流量控制&#xff08;Rate Limiting&#xff09;1.5. 身…

鸿蒙原生开发之状态管理V2

一、ArkTS状态变量的定义&#xff1a; State&#xff1a;状态&#xff0c;指驱动UI更新的数据。用户通过触发组件的事件方法&#xff0c;改变状态数据。状态数据的改变&#xff0c;引起UI的重新渲染。 在鸿蒙原生开发中&#xff0c;使用ArkTS开发UI的时候&#xff0c;我们可以…

矩阵中对角线的遍历问题【C++】

1&#xff0c;按对角线进行矩阵排序 题目链接&#xff1a;3446. 按对角线进行矩阵排序 - 力扣&#xff08;LeetCode&#xff09; 【题目描述】 对于一个m*n的矩阵grid&#xff0c;要求对该矩阵进行 变换&#xff0c;使得变换后的矩阵满足&#xff1a; 主对角线右上的所有对角…

[Lc4_dfs] 解数独 | 单词搜索

目录 1.解数独 题解 2.单词搜索 题解 1.解数独 链接&#xff1a;37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线…

day17 学习笔记

文章目录 前言一、数组的增删改查1.resize函数2.append函数3.insert函数4.delete函数5.argwhere函数6.unique函数 二、统计函数1.amax&#xff0c;amin函数2.ptp函数3.median函数4.mean函数5.average函数6.var&#xff0c;std函数 前言 通过今天的学习&#xff0c;我掌握了num…

自动语音识别(ASR)技术详解

语音识别&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能和自然语言处理领域的重要技术&#xff0c;旨在将人类的语音信号转换为对应的文本。近年来&#xff0c;深度学习的突破推动语音识别系统从实验室走入日常生活&#xff0c;为智能助手、实时翻译、医…

git | 版本切换的相关指令

常见指令 git log --oneline #查看历史提交 git tag latest-backup # 对当前的提交进行标记&#xff0c;标记名为latest-backup git checkout -b old-version 55b16aa # 切换到[55b16aa]的提交中&#xff0c;并标记为[old-version]的分支 git checkout master …

19.OpenCV图像二值化

OpenCV图像二值化 图像二值化&#xff08;Binarization&#xff09;是图像预处理中的一种常用技术&#xff0c;其目的是将图像中的像素值分为两个类别——通常是“前景”和“背景”或者说0和255。二值化能够简化图像信息&#xff0c;为后续的形态学处理、边缘检测、目标识别等…

通过Appium理解MCP架构

MCP即Model Context Protocol&#xff08;模型上下文协议&#xff09;&#xff0c;是由Anthropic公司于2024年11月26日推出的开放标准框架&#xff0c;旨在为大型语言模型与外部数据源、工具及系统建立标准化交互协议&#xff0c;以打破AI与数据之间的连接壁垒。 MCP架构与Appi…

分享一个Pyside6实现web数据展示界面的效果图

今天又是有问题直接找DS的一天&#xff0c;每日一问&#xff0c;今天我的问题是“怎么将pyside6生成的界面转成web界面&#xff0c;使用python语言实现web界面”&#xff0c;等了一会&#xff0c;DS给我提供了两种方案&#xff0c;方案如下&#xff1a; 然后&#xff0c;让我们…

FALL靶场通关攻略

1&#xff0c;下载好靶机后打开&#xff0c;通过kali扫描靶机ip和端口&#xff0c;得到靶机ip为192.168.50.144 2&#xff0c;扫描目录 3&#xff0c;访问靶机 4&#xff0c;访问扫描到的test.php,得到缺少GET请求参数的提示 5&#xff0c;使用FUZZ来扫出参数为file 6&#xff…

Mybatis日志模块分析--适配器模式+代理模式

适配器模式 日志在我们开发过程中占据了一个非常重要的地位&#xff0c;是开发和运维管理之间的桥梁&#xff0c;在Java中的日志框架也非常多&#xff0c;Log4j,Log4j2,Apache Commons Log,java.util.logging,slf4j等&#xff0c;这些工具对外的接口也都不尽相同&#xff0c;为…

圆球法线图,图生法线图 图片生成法线图

目录 圆球法线图 根据图片生成法线图 深度图计算法线图 圆球法线图 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 定义球体的参数 radius 1.0 resolution 100# 生成球体表面的点 u np.linspace(0, 2 * np.pi, resoluti…