Rust 學習筆記:關于枚舉與模式匹配的練習題
- Rust 學習筆記:關于枚舉與模式匹配的練習題
- 以下程序能否通過編譯?若能,輸出是什么?
- 考慮這兩種表示結果類型的方式,若計算成功,則包含值 T;若計算失敗,則包含錯誤 E。在 Rust 中,枚舉 Result2 被認為比結構體 Result1 更符合習慣。下面哪個說法不是一個合理的原因?
- 以下程序能否通過編譯?若能,輸出是什么?
- 以下哪個選項最能描述這個函數?
- 以下程序能否通過編譯?若能,輸出是什么?
- 兩個函數在以下哪種情況下具有相同的行為?
- 以下函數中使用哪種控制流結構最符合慣用法?
- 以下函數中使用哪種控制流結構最符合慣用法?
Rust 學習筆記:關于枚舉與模式匹配的練習題
參考視頻:
- https://www.bilibili.com/video/BV1YNmZYkE8D
以下程序能否通過編譯?若能,輸出是什么?
fn foo(x: &i32) {println!("{x}")
}fn main() {let x = null;foo(x);
}
不能編譯。
error[E0425]: cannot find value `null` in this scope
考慮這兩種表示結果類型的方式,若計算成功,則包含值 T;若計算失敗,則包含錯誤 E。在 Rust 中,枚舉 Result2 被認為比結構體 Result1 更符合習慣。下面哪個說法不是一個合理的原因?
struct Result1<T, E> {ok: Option<T>,err: Option<E>,
}enum Result2<T, E> {Ok(T),Err(E),
}
A. 結構體在運行時占用的內存比枚舉更多
B. 結構體的構造語法比枚舉更冗長
C. 結構體包含的 Option 類型,僅用于包裝結構體
D. 結構體的 ok 和 err 都可以為 None,而枚舉至少有一個不為 None
答:C。
以下程序能否通過編譯?若能,輸出是什么?
enum Location {Point(i32),Range(i32, i32),
}fn main() {let l: Location = Location::Range(0, 5);let n = match l {Location::Point(_) => -1,Location::Range(_, n) => n,Location::Range(0, _) => 0,_ => -2,};println!("{n}");
}
雖然 match 中的最后兩個模式不可能比較得到,但程序可以通過編譯。
程序匹配第二個模式,輸出 5。
以下哪個選項最能描述這個函數?
impl<T> Option<T> {fn unwrap_or(&self, other: T) -> T {match self {Some(t) => t,None => other,}}
}
A. 返回 self 內部的對象(如果存在),否則返回 other
B. 返回一個包含 self 內部對象的新 option(如果存在),否則返回 other
C. 如果 self 尚未包含值,則插入 other
D. 返回對 self 內部對象的引用(如果存在),否則返回 other
答:A。
以下程序能否通過編譯?若能,輸出是什么?
#[derive(Debug)]
enum Either {Left(usize),Right(String),
}fn main() {let x = Either::Right(String::from("Hello world"));let value = match x {Either::Left(n) => n,Either::Right(s) => s.len(),};println!("{x:?} {value}");
}
不能編譯。枚舉 x 被部分移動,不能再讀取。
兩個函數在以下哪種情況下具有相同的行為?
fn decr_twice_v1(n: u32) -> Option<u32> {match n {0 => None,1 => None,n2 => Some(n2 - 2),}
}fn decr_twice_v2(n: u32) -> Option<u32> {if n == 0 {None} else if n == 1 {None} else {Some(n - 2)}
}
A. 對一些輸入有效,但不是所有輸入
B. 對所有輸入有效
C. 對任何輸入無效
答:B。
以下函數中使用哪種控制流結構最符合慣用法?
enum Location {Point(i32),Range(i32, i32),
}fn print_range_max(loc: &Location) {// print the second field of Range, if loc is a Range
}
答:if let。
以下函數中使用哪種控制流結構最符合慣用法?
enum Location {Point(i32),Range(i32, i32),
}fn get_start(loc: &Location) {// return the first field of Range or the only field of Point
}
答:match。