亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

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

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

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

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

作者 | Karim Jedda

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

出品 | CSDN(ID:CSDNnews)

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

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

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

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

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

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

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

  •  
  •  
  •  
cargonew tutorial cdtutorial cargorun

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

輸出與調(diào)試

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

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

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

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

錯(cuò)誤處理

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

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

—— Brian W. Kernighan

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

下面通過(guò)一個(gè)例子來(lái)說(shuō)明 Rust 的這種方法,同時(shí)我會(huì)用 Python 的術(shù)語(yǔ)進(jìn)行解釋。

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

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

使用外部包

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

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

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

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

我花了四五年時(shí)間才找到用 Python 編程的樂(lè)趣,所以我也愿意多花些時(shí)間來(lái)探索 Rust 的高級(jí)功能。Rust 有許多錯(cuò)誤處理的方法,而我喜歡更簡(jiǎn)單的方法。

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

一切看起來(lái)都還不錯(cuò)。那么,測(cè)試方面又如何呢?

編寫(xiě)測(cè)試

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

方法之一如下:

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

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

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

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

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

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

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

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

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

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

發(fā)送 HTTP 請(qǐng)求

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

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

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

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

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

使用 SQLite

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

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

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

舉個(gè)簡(jiǎn)單的例子,別忘了在 Cargo.toml 中添加下面這行代碼:

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

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

總結(jié)

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

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

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

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

網(wǎng)友整理

注冊(cè)時(shí)間:

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

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

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

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

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

答題星2018-06-03

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

全階人生考試2018-06-03

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

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

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

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

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

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定