實做 Rust 教學想到的一些小問題

陳奕熹
陳奕熹
Apr 21 · 2 min read

在看到 Rust 關於「表達式」(會回傳值)與「語句」(不會回傳值)的差異時

我想到一個問題,以下這兩個是等價函式嗎?

fn foo1(x :i32) -> i32 {
x + 1
}
fn foo2(mut x :i32) -> i32 {
x = x + 1;
x
}

注意到值這個例子除了可以討論到表達式與語句間的關係,還需要考慮到 function argument 傳遞的方式

以下是我測試時的程式碼

fn foo1(x :i32) -> i32 {
x + 1
}
fn foo2(mut x :i32) -> i32 {
x = x + 1;
x
}
fn main() {
let x = 3;
let mut y = 6;
println!(“foo1(x) = {}”, foo1(x));
println!(“foo1(y) = {}”, foo1(y));
println!(“foo2(x) = {}”, foo2(x));
println!(“foo2(y) = {}”, foo2(y));
}

直接用 rustc 編譯以上程式會有 warning 關於 y 其實不用設定成 mut 可變變數型態

但是事實上以上程式是能正確執行的,結果也的確符合預期,行為就輸出來看是相同的

foo1(x) = 4
foo1(y) = 7
foo2(x) = 4
foo2(y) = 7

這代表什麼?預設情況下,function parameter 就算傳入原本並沒有 mut 的特性,但是在當作函式參數時會偷偷進行類似 local scope 的 let mut y' = y; 的感覺? 也就是它會直接傳遞一個符合參數預期的複製進入,除非我們用到 & 來達到 call by reference (在 C 裡面就是直接傳遞 pointer address進去)


這不是一個很複雜的實驗,不過不知道 rust 有沒有類似 gdb 的除錯工具,可以直接看到記憶體的表現,如果有的話那麼 trace 起來可能會對整體架構更加了解

陳奕熹

陳奕熹

應該要是一個工程師的……

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade