数组
Rust中有定长数组、变长数组,与两种字符串类似,前者在栈上,记为array,速度快,后者类型为Vector,在堆上,性能较低。
- 声明
Rust数组的声明比C形式较简,与Python形似。
rust
let arr = [1,2,3,4,5];
为数组声明类型,
rust
let a: [u8; 5] = [1,2,3,4,5];
声明重复元素的数组,
rust
//重复5次的3
let a: [u8; 5] = [3; 5]
- 遍历
与Python相似,可用for <ele_var> in <arr>
遍历数组,注意语法上的差异:
Python
python
a = [1,2,3,4,5]
for i in a:
print(i)
Rust
rust
let a = [1,2,3,4,5];
for i in a {
println!("{}",i);
}
- 索引
注意避免越界,
rust
fn main() {
let a = [9, 8, 7, 6, 5];
let first = a[0]; // 获取a数组第一个元素
let second = a[1]; // 获取第二个元素
}
- 数组元素是非基本类型
如要,
rust
let array = [String::from("rust is good!"); 8];
println!("{:#?}", array);
由于基本类型在Rust中赋值是以Copy的形式,而复杂类型没有实现该方法,故报错。
改正,通过循环来声明实现Copy
rust
let str_arr:[String;8] = std::array::from_fn(|_i| String::from("Good"));
结构体
- 定义
Rust中结构体定义语法与C略有差异,
Rust的语法
rust
struct Person {
name: String,
id: String,
}
C
cpp
struct Person{
char name[30];
char id[10];
};
- 创建
这与C&C++结构体初始化的语法很不同,
rust
let auser = Person {
name: String::from("Kirk"),
id: String::from("001"),
};
- 访问
与C&C++相似。
利用#[derive(Debug)]打印结构体变量
rust
#[derive(Debug)]
struct User {
name: String,
email: String,
counts: i32,
}
元组
C++、Python有相似的类型,
rust
let at:(i32, f64, u8) = (300, 3.14, 0);
// 用`.`访问元组
let pi = at.1;
元组常用于函数返回值,
rust
fn main() {
let s1 = String::from("hello");
let (s2, len) = calculate_length(s1);
println!("The length of '{}' is {}.", s2, len);
}
fn calculate_length(s: String) -> (String, usize) {
let length = s.len(); // len() 返回字符串的长度
(s, length)
}
枚举
C++、Python有枚举类型
rust的语法,
rust
enum PokerSuit {
Clubs,
Spades,
Diamonds,
Hearts,
}
与C++相似,枚举值也可以带有值,
rust
enum PokerCard {
Clubs(u8),
Spades(u8),
Diamonds(u8),
Hearts(u8),
}
fn main() {
let c1 = PokerCard::Spades(5);
let c2 = PokerCard::Diamonds(13);
}
rust的枚举类型可以用任何类型做成员,太强大了。
rust
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let m1 = Message::Quit;
let m2 = Message::Move{x:1,y:1};
let m3 = Message::ChangeColor(255,255,0);
}
C语言中有null,指空值;而rust语言抛弃了null,改用Option枚举变量来表达,
rust
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);