Rust基础[part6]_数组与切片、字符串
数组
数组的类型格式:[T; N]
固定长度:必须在编译时指定长度 N,且无法扩容。
可变:如果声明为 mut,可以修改元素值,但不能改变长度。
存储在栈上(除非被装箱到堆上,如 Box<[T; N]>)。
定义
let arr = [1, 2, 3, 4, 5];
println!("Array: {:?}", arr);
默认初始值
// 默认初始值
let arr1: [i32; 4] = [10; 4];
println!("Array with default value: {:?}", arr1);
数组长度
// 数组长度
println!("Array length: {}", arr1.len());
遍历
for index in 0..arr.len() {
// 遍历索引
println!("Element at index {}: {} ...
Rust基础[part5]_引用
不可变引用:通过不可变引用,可以读取变量,但是不能够修改数据。一个变量可以有多个不可变引用,但不能与可变引用共存。
可变引用:通过可变引用,可以读取和修改数据。一个变量在某一时刻只能有一个可变引用,且不能与不可变引用共存。
引用规则
同一时间(生命周期)内,一个变量只能有一个可变引用或多个不可变引用
多个不可变引用可以共存
可变引用必须是独占的(不能与其他引用共存)
引用必须总是有效(Rust保证引用永远不会指向无效内存)
示例1:错误示范
pub fn reference_example() {
let mut s: String = String::from("Hello");
// 创建不可变引用
let s1: &String = &s;
// 创建可变引用(错误:此时s已有不可变引用)
let s2: &mut String = &mut s;
// 错误:不能创建多个可变引用
let s3: &mut String ...
Rust基础[part4]_基本类型,所有权
Rust类型
概览
以下是整合后的 Rust 类型说明表格:
类型
说明
值
i8、i16、i32、i64、i128、u8、u16、u32、u64、u128
给定位宽的有符号整数和无符号整数
42、-5i8、0x400u16、0o100i16、20_922_789_888_000u64、b'*'(u8 字节字面量)
isize、usize
与机器字(32 位或 64 位)一样大的有符号整数和无符号整数
137、-0b0101_0010isize、0xffff_fc00usize
f32、f64
单精度 IEEE 浮点数和双精度 IEEE 浮点数
1.61803、3.14f32、6.0221e23f64
bool
布尔值
true、false
char
Unicode 字符,32 位宽(4 字节)
'*'、'\n'、'字'、'\x7f'、'\u{...}'(Unicode 转义)
(char, u8, i32)
元组,允许混合类型
('%', 0x7f, -1)
()
“单元”(空元组 ...
Rust基础[part3]_函数、流程控制
函数
组成和定义
fn add(i: i32, j: i32) -> i32 {
i + j
}
声明函数的关键字 fn
函数名add()
参数i和j和参数类型 i32
返回值类型`i32``
函数题i+j
函数返回
返回形态
i+j 和 return i+j;
可以有两种形态
return + 分号
无return + 无分号
无返回值的情况:
就返回 ()
fn add(i: i32, j: i32) -> () {
}
永不返回值的情况:
!表示函数永不返回,例如panic!宏会导致程序崩溃,函数不会返回。
fn add_one(i: i32, j: i32) -> ! {
panic!("weeee");
}
死循环也不会返回
fn infinite_loop() -> ! {
loop {
// 永远不会返回
}
}
流程控制
if语法
// if_else();
...
Rust基础[part2]_变量和可变类型
可变变量与不可变变量
可以不指定数据类型
可变变量——mutable
fn immutable() {
let x = 5;
println!("The value of x is: {}", x);
}
不可变变量——immutable
fn mutable() {
let mut y = 10;
println!("The value of y is: {}", y);
y = 15;
println!("The value of y is now: {}", y);
}
常量——constants
需要制定明确的数据类型,并且需要使用大写字母
需要使用常量表达式进行赋值
不支持重定义(遮蔽)
const NUM: i32 = 5;
const THREE_HOURS: i32 = 60 * 60 * 3;
不可变量和常量的区别
常量在编译期就就确定了值,不能在运行时进行改 ...
Rust
未读Rust基础[part1]
安装
➜ rust curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
安装成功
验证
➜ rust rustc --version
zsh: command not found: rustc
因为我是用的是zsh,所以zsh配置文件需要加入配置
➜ rust echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.zshrc
➜ rust source ~/.zshrc
➜ rust rustc --version
rustc 1.88.0 (6b00bc388 2025-06-23)
安装成功!
其他命令:
➜ rust rustup update # 安装
➜ rust rustup self uninstall # 卸载
VsCode插件
rust语言支持:
rust包支持:
toml支持:
rustc
创建目录
mkdir hello-world
cd hello-world
创建源文件main.rs
fn m ...
Solidity
未读WEB3-Day8—Foundry框架[part1]
简介
Foundry Fundamentals
Foundry 是一个相对较新但发展迅猛的智能合约开发框架,以高效性和模块化设计著称。关于这个强大工具的最佳简介可查阅 《Foundry 官方手册》:
Foundry 可管理项目依赖、编译工程、运行测试、部署合约,并支持通过命令行及 Solidity 脚本与区块链交互。
请务必收藏 《Foundry 官方手册》—— 它是最全面的资源,可解答您的所有疑问,在学习过程中会持续提供帮助。
Foundry 的核心优势包括:
借助 Rust 进行编译,相比 Hardhat 或 Brownie 等框架,构建速度显著提升;
完全基于 Solidity 开发,无需学习其他编程语言;
文档体系极为完善。
推荐代码编辑器:Visual Studio Code
在本课程中,我们将使用 Visual Studio Code 完成智能合约的 编写、测试、部署 及 交互。这款轻量级代码编辑器功能强大,支持 Windows、macOS 和 Linux 系统,其丰富的扩展生态系统使其成为智能合约开发的首选工具之一 ...
Solidity
未读WEB3-Day7—Solidity基础[part6]
变量优化
优化仅设置一次的变量的燃气消耗(gas usage)
变量 owner 和 minimumUSD 仅设置一次且永不改变:owner 在合约创建时赋值,minimumUSD 在合约初始化时设定。
评估 FundMe 合约
我们可以通过部署合约并在终端中观察交易来评估创建合约所需的燃气量。在原始合约配置中,我们消耗了近 859,000 单位燃气。
常量(Constant)
为减少燃气消耗,我们可以使用 constant 和 immutable 关键字。这些关键字确保变量值保持不变。更多信息可参考 Solidity 文档。
对于仅赋值一次且永不改变的变量,我们可以应用这些关键字。
对于编译时已知的值,使用 constant 关键字。它会避免变量占用存储槽位,从而使读取更便宜、更快速。
使用 constant 关键字可节省约 19,000 单位燃气,这接近在两个账户之间发送 ETH 的成本。
📝 注意:
constant 变量的命名约定为全大写并以下划线分隔(例如 MINIMUM_USD)。
⚠️ 警告:
将当前 ETH ...
Solidity
未读WEB3-Day6—Solidity基础[part5]
继续完善fundMe合约 的 fund() 和 withDraw()
转换ETH为USD
如果我们的最小交易值需要用美元为单位,我们该如何和msg.value进行比较?
新建一个变量:
uint256 public minimumUsd = 5 * 1e18; // 补全精度
新建两个函数:
// Function to get the price of Ethereum in USD
function getPrice() public {}
// Function to convert a value based on the price
function getConversionRate() public {}
getPrice():获取真实世界中以太坊当前的美元市场价格
getConversionRate():根据当前输入价格进行计算和转换
去中心化预言机
以太坊等资产的美元价格无法仅通过区块链技术获取,而是由金融市场决定。为了获取正确的价格信息,必须在链下数据与链上数 ...
Solidity
未读WEB3-Day5—Solidity基础[part4]
通过函数发送ETH
新建合约 FundMe.sol,在本合约中会通过fund()函数向智能合约转移以太币。该函数将要求最低数量的ETH确保交易正常。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract FundMe{
function fund() public {
}
}
我们还需要一个Withdraw函数,这样合约的owner(拥有者)可以提取不同的funder 发送的资金。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract FundMe{
function fund() public {
}
function withDraw() public {
}
} ...

![Rust基础[part6]_数组与切片_字符串](https://img.soniachen.com/blog/posts/2025/07/image-20250713200224069.png)
![Rust基础[part5]_引用、数组与切片](https://img.soniachen.com/blog/posts/2025/07/image-20250712221340214.png)
![Rust基础[part4]_基本类型,所有权](https://img.soniachen.com/blog/posts/2025/07/image-20250711222125005.png)
![Rust基础[part3]_函数、流程控制](https://img.soniachen.com/blog/posts/2025/07/image-20250710224443048.png)
![Rust基础[part2]_变量和可变类型](https://img.soniachen.com/blog/posts/2025/07/image-20250710105710174.png)
![Rust基础[part1]](https://img.soniachen.com/blog/posts/2025/07/image-20250708170114528.png)
![Foundry框架[part1]](https://img.soniachen.com/blog/posts/2025/07/image-20250707180402433.png)
![Solidity基础[part6]](https://img.soniachen.com/blog/posts/2025/07/image-20250704160915402.png)
![Solidity基础[part5]](https://img.soniachen.com/blog/posts/2025/07/image-20250703173726505.png)
![Solidity基础[part4]](https://img.soniachen.com/blog/posts/2025/07/image-20250702172430218.png)

