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