Rust的設計中為什麼要區分不可變變數和常量?

時間 2021-06-01 03:08:48

1樓:Tracy Liang

剛剛在學習,同樣有這個疑問。

const 在編譯期確定,可能是字面值,指令運算元。不占用資料段,不在堆疊,靜態區等記憶體空間。

let 是執行期佔記憶體空間的,有實體,一般都有位址。只是不可變,在初始化就確定了,但是唯讀。我是不知道這種唯讀變數的意義。

2樓:套路小迷糊

對於初級玩家來說只需要知道 const 有時候不如 let 好用就行了。譬如我可以 let x = 乙個執行時從控制台讀進來的字串。不過 const 不行。

好了,初級玩家需要知道的 const 和 let 的功能性區別講完了。另外 const 的識別符號記得大寫而 let 的識別符號記得使用蛇底寫法。最近看見一些入門級玩家不注意把 const 的識別符號大寫,個人看起來很不爽。

對於中級玩家來說,必須知道 const 不保證記憶體中有乙個對應的實體。而 static 和 let 都是有對應實體的。這一點如果把官方文件通讀之後是肯定知道的。

一般來說 const 對應著 C 語言裡面的 #define 這樣的巨集。(這裡需要特別強調 C 的巨集和 Rust 的巨集完全不是一類東西)

對於高階玩家,請自行查閱 rustc 指導手冊。(畢竟想要晉級高階玩家,自行查閱 rustc 指導手冊和會閱讀 rust 工具鏈的原始碼是非常低的要求)

最後祝您秀髮濃密!

3樓:F001

雖然有很多答案都說對了,我還是補充乙個答案吧。

Rust裡面的const是可以保證編譯期計算的。請注意,const宣告的常量,初始化是可以很複雜的,你可以在初始化過程中呼叫 const fn,而且 const fn 在這種環境下是保證在編譯階段執行的。這個執行過程就是執行內建在編譯器裡面的 MIR 直譯器。

這個編譯期計算能力是很重要的,對比C++裡面 constexpr 之前,要做類似的事情,只能用模板元程式設計來實現。而後大家發現用這種方式來搞編譯期計算其實是不合適的,不如用更直接的表達方式,就像寫普通函式那樣搞。

4樓:

為什麼要區分變數和常量呢?

先想清楚這個問題。

Rust裡的常量是在編譯期就內聯到使用它的地方,它是沒有固定位址的。重點是編譯期。

不可變變數,終究還是變數,需要執行時確定具體的值。你甚至可以引用它。

5樓:Abby Chau

語義上分別很明顯。Const 是macro。

我想說在這個編譯器可優化的專案中,到底是不是真的要引入const 這個關鍵字。

當然不是真的。Rust 只是想確定使用者理解自己在做甚麼而已。static 的lifetime 也是。

像是在不久之前,match pattern 中的lifetime 標示自動化一樣,自不自動化這個,更像是個語言設計的取向而已。

這個取向的好處自然是降低let 的學習成本的同時令語義又清淅。

6樓:

這個問題更加適合問 Kotlin 的valconst val,而不是 Rust 的 let 和 const。

Rust 中的 let 在編譯期間接受的是生命週期檢查,不會被執行(所以哪怕繫結的右邊建立過程發生了錯誤也能編譯通過)。const 則會被執行並內聯到呼叫處。而無論是 let 還是 let mut 繫結的物件,都是在執行期間建立與銷毀的。

const 則是在編譯期間就確定了資料和生命週期(靜態),且不會被統一引用。

7樓:城陵

const 的值在編譯時可以確定,不可變變數再怎麼不可變,它都還是變數啊,既然是執行時才能確定的東西當然要和 const 分開,這是再自然不過的事。

8樓:暮無井見鈴

參考這裡,和 C++ 做 constexpr 的意義差不多。

既然各個編譯器都能執行常量摺疊和常量傳播,那constexpr有什麼意義呢?

C++ 最初的設計就想讓 const 兼顧常量表示式和表示不可寫限定的語義,結果還是讓很多人不夠滿意。(題外話,還有個問題是 const 非靜態成員物件(以及成員引用)會帶來意外的麻煩,見 std::launder )

9樓:juu wiio

const是編譯期常量替換,類似於C的macro,這是很多「高階」語言不具有的能力。let是執行期的變數,可以根據使用者輸入初始化,可以取引用

如果你是說編譯器自動判定let可以是const……我覺得explicit總是更好的,程式設計師寫的時候就應該清楚這是乙個編譯期常量還是執行期變數並表明自己的意圖。Rust本來就強調對程式精細的控制,沒那麼多自動化。const可以定義在module裡,甚至可以供其它crate使用,不知道你理解的「不可變變數」是否應該包括這樣的功能。

另外const函式如果賦值給const就是編譯期計算,賦值給let就是執行期計算

Rust設計時就兼顧了語義和底層實現,const也並非「引入」而是自然存在的。某些語言中認為不大的差別比如通過洩露分析自動判定變數在棧上還是在堆上,Rust是不會支援的

其實真正需要對比的是const和static,「編譯器自己搞定」還需要從中選乙個

Rust裡為什麼要區分Copy型別的borrow和unborrow形式

hu zhi 看乙個問題要抓住關鍵部分 這個時候不管你 move 還是 borrow 還是 clone,執行時代價都是一樣的 誰說不管用 move 還是 borrow 還是 clone,代價都一樣?move clone 一下要 copy 所有 byte。borrow 只需要建立乙個 8bytes 的...

為什麼單機遊戲的角色原畫設計也要區分職業?

星海遊人 你闡述的內容是在用美術的最入門零散知識點去強行概括遊戲產品本身的大方向架構以及內容設計。雖然這兩者有工作內容上的聯絡,但實際上出發點完全風馬牛不相及。你問的內容是電子遊戲內容設計本身,你不能拿美術培訓班的那些東西去套整個遊戲設計流程。美術只是視覺環節實現這些設計的具體執行單位。該做個什麼樣...

漢語為什麼要區分 的 , 地 , 得 ?

幻想的世界 不邀自來 的 一般用於形容詞後面接名詞,xx的xx,比如繁忙的學業,嚴厲的老師 地 一般是用於副詞副詞或形容詞後面接動詞或形容詞 形容詞極少遇見 比如默默地離開,慢慢地走 得 一般是後面的詞補充說明 修飾 前面的詞一般已動詞 修飾詞出現的居多,舉例笑得開心,做得很好 一般來說 的 的使用...