日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

摘要:Python/ target=_blank class=infotextkey>Python 和 Rust,都是近幾年深受開發(fā)者喜愛的編程語言,那么作為一個擁有十年 Python 編程經(jīng)驗(yàn)的開發(fā)者來說,初次嘗試 Rust 會有怎樣的感受呢?

鏈接:https://karimjedda.com/carefully-exploring-rust/

作者 | Karim Jedda

譯者 | 彎月 責(zé)編 | 鄭麗媛

出品 | CSDN(ID:CSDNnews)

最近,我找到了一份新工作,公司最常用的編程語言之一是Rust。

在此之前,我使用 Python 長達(dá)十年之久,主要是做數(shù)據(jù)工程的工作。但如今,我打算嘗試一下這種新的(對我來說)編程語言。我經(jīng)常在不同平臺上看到各類夸贊 Rust 的文章,我想看看 Rust 是否真的不負(fù)盛名。

Rust 與 Python 有很大的不同,因此我不打算在本文中詳細(xì)說明 Rust 的獨(dú)特之處。作為初學(xué)者,我只希望盡快上手,希望能以最短的過渡,盡快用Rust 完成工作,同時也希望評估一下我自己的學(xué)習(xí)能力。

從某種程度上來說,我更感興趣的是 Rust 整體的使用體驗(yàn),而不是具體的功能列表。

設(shè)置開發(fā)環(huán)境

設(shè)置開發(fā)環(huán)境非常簡單,只需參照 Rust 網(wǎng)站提供的示例,在終端中運(yùn)行一個命令就可以了。

當(dāng)你認(rèn)為一切都已安裝并配置妥當(dāng),此時如果想驗(yàn)證 Rust 是否已正確安裝,只需在空目錄中創(chuàng)建一個空項目:

  •  
  •  
  •  
cargonew tutorial cdtutorial cargorun

接下來,在文本編輯器中打開該文件夾。如果你是新手,我推薦 VSCode,因?yàn)槠渲械囊恍U(kuò)展很有幫助,關(guān)于如何使用這些擴(kuò)展的指南也很容易入手。我推薦 rust-analyzer 作為 VSCode 的唯一擴(kuò)展。

輸出與調(diào)試

如果想了解程序是如何運(yùn)行的,首先要做的就是通過命令行來了解程序在干什么,以及完成了什么。

此外,你還可以使用常規(guī)調(diào)試器。在 M1 上,我推薦在 Visual Studio Code 中使用 LLDB,它不僅工作良好,通常還要比在輸出結(jié)果中打印日志更為方便。

到這里為止,Rust 與 Python 其實(shí)都非常相似,只不過所有命令都是通過 cargo run 運(yùn)行的,而不是調(diào)用特定文件,如 python3 somefile.py。

另外,你也可以先運(yùn)行 cargo build,然后運(yùn)行 target/debug/tutorial 中的文件,得到的結(jié)果是相同的。接下來,如果將生成的文件復(fù)制到另一個位置或另一臺類似的機(jī)器上,也可以正常工作,且無需安裝任何與 Rust 相關(guān)的東西。

錯誤處理

不得不承認(rèn),編程中總會遇到一些意外,能夠以可預(yù)測的方式處理這些意外非常重要。編程中的一大挑戰(zhàn)就是很難考慮到程序中所有可能出現(xiàn)的錯誤,因?yàn)橹灰獙懘a就可能會出錯。

“每個人都知道調(diào)試比編寫程序要難一倍。所以,如果你在代碼編寫代碼時就用盡了聰明才智,又如何調(diào)試呢?”

—— Brian W. Kernighan

在 Python 中,通常我們通過 try/except 方法來拋異常,并完成錯誤處理。我們運(yùn)行一段代碼,如果出錯,則通過條件來捕捉異常,如果所有條件都不匹配,則將其放入一個通用的異常中。異常有各種不同的類別,Python 允許你在包中調(diào)用不存在的函數(shù),并在運(yùn)行時產(chǎn)生異常,但在 Rust 中這樣做甚至無法通過編譯——Rust 不允許在運(yùn)行時出現(xiàn)任何奇怪的錯誤,從而消除了一大類不太容易預(yù)測的錯誤。

下面通過一個例子來說明 Rust 的這種方法,同時我會用 Python 的術(shù)語進(jìn)行解釋。

在上面的代碼中,我們創(chuàng)建了一個自定義的異常,在 do_something 函數(shù)中拋出,而 main 函數(shù)會檢查該異常。上面的代碼跟 try/exept 基本上一樣,只不過多了一些樣板代碼( 這些樣板代碼是必須的,但以我現(xiàn)在的水平有點(diǎn)難以理解) 。

你也許會說“肯定有更好的辦法”,特別是如果你有很多 Python 經(jīng)驗(yàn)的話,的確如此,我們將不得不使用包。。

使用外部包

與其他行業(yè)相比,編程的最大優(yōu)勢就是可以使用別人構(gòu)建的東西。如果你計劃在程序中進(jìn)行錯誤處理,那么有一個很好用的包 thiserror。Rust 的包管理器是 cargo。

Rust 中的包叫做 crate。安裝方法為編輯目錄下的 Cargo.toml 文件。在本例中,我們在 [dependencies] 后面添加 thiserror = "1.0" 就可以了。

然后可以像下面這樣重寫之前的代碼:

現(xiàn)在代碼看起來很正常。與一切從頭開始相比,我更喜歡這種做法。

我花了四五年時間才找到用 Python 編程的樂趣,所以我也愿意多花些時間來探索 Rust 的高級功能。Rust 有許多錯誤處理的方法,而我喜歡更簡單的方法。

我有意略過了一些簡單的概念,比如“什么是 enum?” “pub 是什么意思?” “那些#標(biāo)記是什么”等,因?yàn)槟阒恍柽\(yùn)行一下代碼就能明白它們的意思。

一切看起來都還不錯。那么,測試方面又如何呢?

編寫測試

測試應(yīng)該從單元測試和集成測試兩個級別上著手。實(shí)現(xiàn)方法有好幾種,雖然你可以把測試代碼和 Rust 代碼放在同一個文件中(這也是官方指南的推薦),但我還是希望用一個單獨(dú)的文件夾來組織所有測試代碼,這樣可以減少閱讀代碼時的負(fù)擔(dān),也可以減少編輯文件時占用的屏幕面積。而且說實(shí)話,在編寫測試和編寫代碼時,我的心情是不一樣的。

方法之一如下:

然后可以用 cargo test 運(yùn)行測試,結(jié)果如下:

還有許多值得展開講的地方,但為了避免過于復(fù)雜,我們點(diǎn)到為止,這算是“帕累托最優(yōu)”(又稱80/20法則)。這讓我想起了 pytest,一個能即刻提高舒適度的工具。

讀取文件、運(yùn)行一些代碼并寫入另一個文件

以上,我們討論了一些最基本的問題:輸出,調(diào)試,使用外部包,以及測試。下面,我們來做一些更有效率的事情:我們可以寫一個程序來處理本地文件。下面的例子將會讀取 CSV 文件,計算一些數(shù)值,然后將輸出結(jié)果。

為了實(shí)現(xiàn)該程序,我們需要在 Cargo.toml 中添加以下兩行設(shè)置:

  • csv="1.1"
  • serde={version="1", features=["derive"]}

你可以猜猜 main 函數(shù)應(yīng)該怎樣寫。

當(dāng)然,這個程序還可以實(shí)現(xiàn)更多功能。如果你有一個非常復(fù)雜的 CSV 文件,則可以在 Rust 中調(diào)用 pandsa(pola.rs)來處理數(shù)據(jù)。我還需要進(jìn)一步研究,不過似乎這種處理方法非常強(qiáng)大且高效。

我認(rèn)為,與 Python 相比,Rust的 CSV 處理能力不相上下,除了它能自動反序列化之外。

最后,我們還可以添加一些測試,此處不再贅述。

發(fā)送 HTTP 請求

下面,我們來嘗試發(fā)送基本的 HTTP 請求并處理結(jié)果。現(xiàn)在的絕大多數(shù)請求都需要處理 JSON。

在 Cargo.toml 中添加如下幾行代碼:

  •  
  •  
  •  
reqwest= { version = "0.11", features = [ "json"] } tokio= { version = "1", features = [ "full"]} serde_json= "1"

這樣就可以了,現(xiàn)在可以從 API 請求數(shù)據(jù)了。結(jié)合使用上面兩個方法,我們可以獲取數(shù)據(jù),用 pola.rs 進(jìn)行分析,然后將結(jié)果寫入 CSV 文件中,同時保證內(nèi)存安全。還記得 Python 需要循環(huán)才能實(shí)現(xiàn)這一點(diǎn)嗎?在這方面 Rust 做得很好。

我相信,Rust 的生態(tài)系統(tǒng)會越來越大,以覆蓋更多的用例,以后利用已有的 crate 實(shí)現(xiàn)這一切會易如反掌。

使用 SQLite

雖然在這篇文章中提到 SQLite 似乎有些奇怪,但我開發(fā)過的程序經(jīng)常用到 SQLite。我很喜歡 SQLite,因?yàn)樗强梢浦驳模浅S行В也恍枰魏尉S護(hù)。

用 Python 操作 SQLite 的問題永遠(yuǎn)是要不要使用 ORM。請不要誤會,SQLAlchemy 非常優(yōu)秀,但在進(jìn)行非常小的操作時,用它就像殺雞用牛刀了。而且 SQLAlchemy 帶來的復(fù)雜性使它不適合小型嵌入式設(shè)備。

反之, Rust 可以在這方面大放異彩,網(wǎng)上有很多如何利用Rust操作 SQLite 的例子,我認(rèn)為都非常不錯。

舉個簡單的例子,別忘了在 Cargo.toml 中添加下面這行代碼:

  •  
rusqlite= { version = "0.28.0", features = [ "bundled"] }

該例子來自 rusqlite crate。當(dāng)然,這只是冰山一角。但組合以上幾種方法,就可以實(shí)現(xiàn)許多很有用的功能了。

總結(jié)

綜合考慮,Rust 是一個非常優(yōu)秀的語言,有許多優(yōu)秀的包,非常感謝發(fā)明這門語言并為之努力貢獻(xiàn)的開發(fā)者們。雖然這篇文章只是對 Rust 做了初步的探索,但我希望拋磚引玉,讓初學(xué)者產(chǎn)生學(xué)習(xí) Rust 的興趣。

初次使用某種編程語言時,重點(diǎn)在于弄清楚語言本身能實(shí)現(xiàn)哪些功能,而不是背誦一篇完整的術(shù)語表。你不需要去理解 borrowing、繼承或 traits 的具體含義,而應(yīng)該跟隨些入門文章按部就班地做一遍。

從無到有的難度遠(yuǎn)大于從一到十。

分享到:
標(biāo)簽:Rust
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定