C語言的壹些好的經驗曾經通過閱讀POV-Ray源代碼學會了如何在C語言中實現面向對象編程。
通過閱讀GTK+源代碼,了解C語言代碼的清晰、幹凈和可維護性。
通過閱讀SIOD和Guile的源代碼,我們知道如何用C語言實現Scheme解析器。
用C語言寫GNOMEEye的初始版本,優化微文件渲染。
C語言的壹些不好的經歷我在進化組的時候,很多東西總是死機。
那個時候還沒有沃頓莊園。為了獲得Purify,妳需要購買壹臺Solaris機器。
調試gnome-vfs線程死鎖問題。
調試Mesa,但壹無所獲。
我接手了Nautilus-share的初始版本,卻發現代碼中並沒有使用free()。
我想重構我的代碼,但我不知道如何管理我的內存。
想把代碼打包,卻發現到處都是全局變量,沒有靜態函數。
但不管怎樣,我們還是來說說在Rust裏但在C語言裏沒有的東西吧。
自動資源管理Rust借鑒了C++的壹些思想,如RAII(資源獲取初始化)和智能指針,增加了值的單壹所有權原則,提供了自動決策的資源管理機制。
自動化:不需要手動調用free()。
內存會在使用後自動釋放,文件會在使用後自動關閉,互斥會在作用域外自動釋放。
如果妳想封裝外部資源,基本上妳只需要實現Drop trait。
打包的資源就像編程語言的壹部分,因為妳不需要管理它的生命周期。
決策:創建資源(內存分配、初始化、打開文件等。)然後在範圍外銷毀。
沒有垃圾收集這回事:當代碼被執行時,壹切都結束了。
程序數據的生命周期看起來像壹個函數調用樹。
如果我寫代碼的時候總是忘記調用這些方法(free/close/destroy),或者發現之前寫的代碼忘記調用了,甚至調用錯了,那麽我就不想再用這些方法了。
泛型Vec實際上是元素T的向量,而不僅僅是對象指針的數組。
編譯後,它只能用於存儲t類型的對象。
用C語言實現類似的功能需要很多代碼,不想再做了。
Trait不僅僅是壹個interfaceRust,它不是那樣的面向對象編程語言,它有壹個trait,看起來像是計算機中的壹個接口——可以用來實現動態綁定。
如果壹個對象實現了Drawable,那麽就可以確定這個對象有draw()方法。
但無論如何,特質的力量不止於此。
依賴管理之前需要實現依賴管理:手工調用g-config或者通過自動化工具宏調用。
指定頭文件和庫文件路徑。
基本上,人們需要確保安裝了正確版本的庫文件。
在Rust中,妳只需要寫壹個Cargo.toml文件,然後在文件中指明依賴庫的版本。
這些依賴庫將被自動下載或從指定的地方獲得。
用C語言測試單元測試非常困難,原因如下:內部函數通常是靜態的。
換句話說,它們不能被外部文件調用。
測試程序需要用#include指令包含源文件,或者在測試過程中使用#ifdefs刪除這些靜態函數。
妳需要寫壹個Makefile把測試程序鏈接到壹些依賴庫或者壹些代碼上。
妳需要使用測試框架,在上面註冊測試用例,並學習如何使用它們。
HygienicMacro)Rust的health宏避免了C語言宏可能出現的問題,比如宏中的某些東西會掩蓋代碼中的標識符。
Rust不要求宏中的所有符號都使用括號,比如max(5+3,4)。
沒有自動轉換。在C語言中,遼寧北大青鳥發現很多bug都是無意中把int轉換成short或者char造成的,Rust中不會出現這種情況,因為需要顯示轉換。
不會出現整數溢出,這個就不用解釋了。