基础概念
rust
的枚举类型相对于C++来说,有更强大的表现能力,先给出最基本的定义方式:
enum IP{
V4,
V6,
}
fn main() {
let ipv4 = IP::V4;
let ipv6 = IP::V6;
}
枚举类型可以有不同的数据类型,并存储对应的数据,给出代码实例:
enum IP {
V4(u8, u8, u8, u8),
V6(String)
}
fn main() {
let ipv4 = IP::V4(127, 0, 0, 0);
let ipv6 = IP::V6(String::from("::1"));
}
枚举类型可以有自己的impl
块,代码实例:
enum Message {
Quit,
Move {x:i32, y: i32},
Write (String),
ChangeColor(i32, i32, i32),
}
impl Message {
fn call(&self) {
}
}
fn main() {
let m = Message::Write(String::from("hello"));
m.call();
}
rust中没有null reference
的概念,不过有很多时候我们需要None
的判别,下面给出一个可行的方式:
// enum Option<T> { // 这是标准库的方式
// Some(T),
// None,
// }
fn main() {
let some_number = Some(5);
let some_string = Some("a String");
let absent_number: Option<i32> = None; // 定义的空类型
}
注意,上面的some_number
不能直接和i32
相加,而是需要一些类型转化。
match
匹配块
给出代码实例:
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => { // 可以使表达式,注意箭头的表达方式
println!("Lucky penny");
1
},
Coin::Nickel=> 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
fn main() {
let coin = Coin::Penny;
println!("{}", value_in_cents(coin));
}
match
中的值绑定,给出代码实例:
#[derive(Debug)] // 为了trait使用,暂时不必管
enum UsState {
Alabama,
Alaska
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => { // state是对应的绑定值
println!("State quarter from {:?}", state); // 输出绑定值的方式
25
}
}
}
fn main() {
let coin = Coin::Quarter(UsState::Alaska); // 定义枚举,并绑定数据
println!("{}", value_in_cents(coin));
}
在给出一个代码实例,如果是空直接返回,否则返回+1
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None, // 空的匹配
Some(i) => Some(i + 1),
}
}
fn main() {
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
}
可以使用_
来表示任意匹配,简单的例子:
match x {
1 => println!("hello world"),
_ => println!("nothing");
}
if-let
语句的表达
这么做的最有价值的地方,在于简化表达方式:
let some_u8_value = Some(0u8);
match some_u8_value {
Some(3) => println!("three"),
_ => (),
}
这和下面这种方式等价:
let some_u8_value = Some(0u8);
if let Some(3) = some_u8_value {
println!("three");
}
唯一的缺陷在于缺少了穷进性检查