初學者學習Rust容易碰到的問題 - tim

banq發表於2022-05-02

對許多人來說,學習 Rust 感覺很難。更重要的是,人們推遲學習 Rust 是因為認為它可能太難了。
人們經常爭辯說,Rust 的所有權和生命週期概念很新穎,因此很困難。我想知道這是否完全正確。所有程式語言都有困難的概念。我懷疑學習 Rust 的困難部分是由核心語言之外的因素造成的。
學好 Rust 涉及學習駕馭充滿行話和隱含文化規範的社會文化、景觀。
下面是初學者容易碰到的問題:

String和&str之間的區別是什麼?
如果Rust社群找到一種方法來快速回答這個問題--這恰好是Stack Overflow上rustlang標籤中評分最高的問題--給那些剛接觸Rust的人,那麼它作為一種通用的程式語言就會成功。
如果沒有一個簡潔的答案,Rust對很多人來說仍然是神秘的。

理解String vs &str意味著對所有權系統的理解,這意味著對生命週期系統的理解。
這可能意味著你已經接觸到了指標、引用,甚至可能是別名。
這裡通常會交織著關於可變性的討論。
獲得對錶示文字的資料型別的直覺得益於對編碼的理解,而編碼則得益於對CPU執行方式的理解。

我還沒有為完全的初學者找到一個pass的心理方法。但是我知道另一種系統程式語言的學習者在這裡有明顯的優勢。

常見的策略是告訴使用者:他們應該 "暫時使用String"。
每個人都知道,這只是一個半答案。一個旨在給學習者一些時間的答案。但這甚至不是一個半答案。
不用多久,他們就會遇到一個以&str(或者更糟糕的是AsRef<str>)為引數的函式的引數。

難以找到的預設值
每當你在使用者面前放置一個需要他做決定的決策點,你就會引入認知負荷。
認知負荷對於初學者來說尤其昂貴,他們需要在工作記憶中保留大量的細節,以便在編寫程式碼時取得進展。

Rust社群重視精確性。我們關心我們的價值觀是如何在記憶體中佈局的。
我們希望給開發者提供強大的型別安全,這樣他們就能寫出健壯的程式。

不幸的是,對於Rust的新使用者來說,往往有多種選擇,而這些選擇看起來應該是沒有的。

  • 哪種數字型別是 "正確的"?
  • 什麼時候應該使用&str、String、Cow、T: Display、T: AsRef<str>、T: Into<string>或其他任何選項?
  • HashMap vs BTreeMap用於對映鍵和值
  • 很難理解幾個聽起來相似的特性之間有什麼區別,例如ToString vs ToOwned vs Into<string>和Debug vs Display。
  • 為什麼有這麼多轉換型別的方法?什麼時候應該使用 as 關鍵字?.into()、T::from()和.try_into()怎麼樣。

我們應該在給予指導方面做得更好。

難以知道該使用哪個crate
Rust有一個由crates.io支援的豐富的crate生態系統,它提供了語義版本和不可變的版本。這使得庫的作者可以在可靠性的支援下進行快速而強大的創新。這個生態系統也有它的弊端。

crates.io的無名稱空間政策很容易導致名字被盜用,而通常由一個作者編寫的單個庫則很容易受到側面攻擊。

我認為,可能會有另一個crate註冊中心的空間,它提供精心策劃的板塊集合,可能在保留的名稱空間內。(如果我有幾百萬美元,這將是我的創業想法!)。

這種情況是難以駕馭的,特別是對於初學者。我們的crate有可愛的名字,而不是描述性的名字。
需要一些經驗才能知道parking_lot是優秀的同步基元的crate。

也許解決這個問題的方法之一是提供精心策劃的crate集合。

相關文章