年后跳槽,從 Go 到 Rust 面試掛了
大家好,我是漁夫。
今天分享主題,Rust 相關面經(jīng)。
1.什么是匹配表達式?
匹配表達式是一種控制流構造,使您能夠比較模式集合中的特定值并執(zhí)行與第一個匹配模式相關的代碼。它類似于其他編程語言中的 switch 語句,但匹配表達式在 Rust 中提供了更多的安全性和靈活性。
2.Rust 如何使用匹配表達式?
Rust 中使用匹配表達式將值與一系列模式進行比較,并執(zhí)行與第一個匹配模式相關的代碼。匹配表達式可以按以下方式使用。
例子:
fn main() {
let my_number = 9;
// 使用 match 表達式匹配數(shù)字并執(zhí)行相應代碼
match my_number {
0 => println!("數(shù)字是零"),
1..=10 => println!("數(shù)字在1到10之間"),
11..=50 => println!("數(shù)字在11到50之間"),
_ => println!("數(shù)字不在以上范圍內(nèi)"),
}
}
這個例子中,match 表達式匹配了不同的數(shù)字范圍,并分別執(zhí)行了相應的代碼。..= 運算符表示閉區(qū)間,_ 是通配符,表示除了之前列出的模式之外的所有情況。
3.trait bound 和 where 子句有什么區(qū)別?
特征邊界和 where 子句用于向函數(shù)和類型添加約束,確保它們遵守特定的要求或條件的,特征邊界用于約束類型參數(shù)以實現(xiàn)特定特征。通過在類型參數(shù)后面放置冒號 (:) 和特征名稱來指定的。
Trait bound 例子:
fn print_debug<T: std::fmt::Debug>(value: T) {
println!("{:?}", value);
}
fn main() {
let my_value = 6;
print_debug(my_value);
}
Where 子句的例子:
fn print_debug<T>(value: T) where T: std::fmt::Debug {
println!("{:?}", value);
}
fn main() {
let my_value = 8;
print_debug(my_value);
}
通過使用 trait bounds 或 where 子句,我們可以在編寫泛型代碼時提供對泛型參數(shù)的限制,以確保代碼的類型安全性和正確性。
4.Rust 中的閉包捕獲有哪些類型?
在 Rust 中兩種類型的閉包捕獲:
- 移動捕獲:當閉包將變量從其封閉環(huán)境中移動到閉包內(nèi)部時,稱之為“移動捕獲”。這意味著閉包獲得了變量的所有權,可以修改它,但封閉環(huán)境中的原始變量不再可訪問。
- 借用捕獲:當閉包從其封閉環(huán)境中借用變量時,稱之為“借用捕獲”。這表示閉包可以訪問和修改變量,但封閉環(huán)境中的原始變量仍然可以被訪問。
5.在 Rust 中可變閉包和不可變閉包有什么區(qū)別?
閉包是從封閉范圍捕獲變量的匿名函數(shù),根據(jù)閉包修改或編輯捕獲的變量的能力,可以將閉包視為可變或不可變。
不可變閉包通過引用捕獲變量,這意味著它可以讀取變量但不能修改它們。
示例:
let x = 5;
let closure = || {
println!("不可變閉包捕獲的值: {}", x);
};
closure();
可變閉包通過可變引用捕獲變量,這意味著它可以讀取和修改捕獲的變量。值得注意的是,可變閉包要求捕獲的變量也是可變的。
示例:
use std::cell::RefCell;
fn main() {
let y = RefCell::new(10);
let mut_closure = || {
let mut y_ref = y.borrow_mut();
*y_ref += 1;
println!("可變閉包捕獲的值: {}", *y_ref);
};
mut_closure();
}
6.Rust 特征和接口有什么區(qū)別?
在 Rust 中,特征和接口定義了類型必須實現(xiàn)的一組方法,先來看看特征:
特征 (Traits):
- Rust 中,類似于其他語言中的接口或抽象類的概念
- 通過 Trait 關鍵字定義
- 允許為不同類型實現(xiàn)相同的行為
- 可以包含方法簽名、關聯(lián)類型和常量
- 通過 impl 關鍵字為類型實現(xiàn)特征
示例:
trait Printable {
fn print(&self);
}
// 為類型實現(xiàn)特征
struct MyStruct;
impl Printable for MyStruct {
fn print(&self) {
println!("Printing from MyStruct");
}
}
fn main() {
let my_instance = MyStruct;
my_instance.print();
}
接口 (Interfaces):
- 在 Rust 中接口(interface)是沒有關鍵字的,Rust 更傾向于使用 "特征" 這個術語,不像Java等語言。
- 通常與對象導向語言中的接口類似,但 Rust 中更強調(diào)在 trait 上實現(xiàn)的自動推導和靈活性。
7.編寫一個程序,使用 Rust 的網(wǎng)絡功能在兩臺機器之間發(fā)送數(shù)據(jù)。
8.什么是 Rust 中的生命周期?為什么需要生命周期?
Rust 中的生命周期是一種標記,用于指定引用的有效范圍,它的作用是確保引用不會超出其引用的對象的生命周期,防止懸垂引用和非法引用。包括:
- 避免懸垂引用: 確保引用不會超過其引用的數(shù)據(jù)的生命周期,防止使用已經(jīng)被銷毀的數(shù)據(jù)。
- 避免非法引用: 確保引用在其生命周期內(nèi)有效,防止訪問已經(jīng)被銷毀的數(shù)據(jù)或失效的引用。