Rust 中"上下文"設計構想 - Tyler Mandry
我最近與Niko Matsakis和Yoshua Wuyts想出了一個很有前途的想法來解決我稱之為 Rust 中的“上下文問題”。這個想法的靈感來自其他語言的特性,比如隱式引數、效果和物件功能。雖然這還處於開發的早期階段,但我在這裡分享它是希望從 Rust 社群獲得更多的觀點和想法。
問題
在程式設計中,我們經常發現自己需要在程式碼的許多地方訪問某個上下文物件。上下文物件的一些示例:
- 競技場分配器
- 字串內部
- 記錄範圍
- 非同步執行器
- 能力物件
今天我們有兩種主要的方法來使用這些上下文物件。
一種是將上下文作為引數新增到每個傳遞依賴於它的函式中。這很不方便(儘管有時可以透過將其儲存在結構中並透過self引數走私來使其更容易)。比不便更糟糕的是,如果您需要透過您無法控制的程式碼來執行緒化上下文,您就會陷入困境——除非該程式碼的作者提供了一種通用的方式來傳遞上下文。
傳遞上下文的第二種方式是使用一種全域性變數,通常是執行緒區域性變數。
thread_local!(static RUNTIME: Option<async_std::Executor> = None);
這使得傳遞上下文變得更加容易,包括透過您無法控制的程式碼。對於許多用例,這是一個很好的解決方案。但是執行緒區域性變數存在很多問題:
- 不支援堆疊分配
- 他們需要平臺支援
- 解構函式通常不會執行
- 它們通常不適合圖書館使用
- 它們不會被在其他執行緒上執行的邏輯巢狀程式碼繼承,例如 rayon scope任務
- 他們需要內部可變性
- 它們需要靜態初始化,這實際上意味著將上下文儲存在 Option 中並展開,或使用類似的東西 lazy_static!
- 它們不符合人體工程學:每次使用都需要引入一個封閉裝置;沒有通用的“範圍設定器”
宣告你的上下文
如果 Rust 程式碼可以改為宣告它需要的上下文,並且編譯器負責確保提供了該上下文會怎樣?
這個一般概念在其他語言中由幾種不同的方法解決:
- 依賴注入
- 隱式引數
- 效果Effects
這裡提出的方法像隱式引數一樣工作,與其他語言的效果在句法和概念上有一些相似之處,這使得它更方便並更好地整合到 Rust 的型別系統中。它還可以用於實現依賴注入。這種方法:
- 執行時開銷為零;它編譯成你無論如何都會寫的程式碼
- 靜態保證您需要的任何上下文都可用
- 允許傳遞對堆疊上物件的引用
- 與特質系統整合
- 遵循簡單的規則
。。。。
原文點選標題
結論
在這篇文章中,我們看到了一種在 Rust 中共享上下文的新方法。它允許在不汙染呼叫站點的情況下傳遞上下文,甚至可以透過您無法控制的程式碼。它可以在應用程式程式碼和庫程式碼中使用。它需要對型別系統進行高階擴充套件,但要使用已經熟悉的概念(如生命週期),作為回報,我們可以使用 Rust 語言對重要模式(如功能)進行建模。
相關文章
- 想學設計模式、想搞架構設計,先學學UML系統建模吧您設計模式架構
- Rust程式設計與專案實戰-結構體Rust程式設計結構體
- Xilem:Rust中的UI架構RustUI架構
- rust程式設計(3)結構體相關概念和疑問Rust程式設計結構體
- 010 Rust 網路程式設計,cargo 構建指令碼介紹Rust程式設計Cargo指令碼
- Hadoop HDFS 設計隨想Hadoop
- Rust 程式設計影片教程對應講解內容-結構體Rust程式設計結構體
- 戲說領域驅動設計(六)——限界上下文——設計
- Rust 程式設計,Option 學習Rust程式設計
- Java程式設計師學習Rust程式設計 - infoworldJava程式設計師Rust
- Rust 程式設計影片教程(進階)——004_2 函式和結構體中的生命週期Rust程式設計函式結構體
- Rust 程式設計視訊教程對應講解內容-結構體Rust程式設計結構體
- Rust 中的位元組序、API 設計和多型性 - JimmyRustAPI多型
- DDD設計工具:上下文對映器ContextMapperContextAPP
- Rust 程式設計,讀取檔案Rust程式設計
- 學習Rust 併發程式設計Rust程式設計
- Rust 程式設計視訊教程(進階)——004_2 函式和結構體中的生命週期Rust程式設計函式結構體
- 程式設計師被打斷:中斷和上下文切換的真正代價程式設計師
- 架構設計中的基本原則架構
- 同構——程式設計中的數學程式設計
- 009 Rust 非同步程式設計,select 宏中的使用 default 和 completeRust非同步程式設計
- 程序上下文、中斷上下文及原子上下文
- Rust 程式設計:記憶體佈局Rust程式設計記憶體
- 001 Rust 非同步程式設計,Why AsyncRust非同步程式設計
- 014 Rust 非同步程式設計,遞迴Rust非同步程式設計遞迴
- 016 Rust 網路程式設計,FTP 示例Rust程式設計FTP
- Rust 程式設計小專案:WebServer 05Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 06Rust程式設計WebServer
- 003 Rust 網路程式設計,使用 IpAddrRust程式設計iPad
- 004 Rust 網路程式設計,使用 SocketAddrRust程式設計
- Rust 程式設計,用 vector 實現棧Rust程式設計
- Rust 程式設計小專案:WebServer 01Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 02Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 03Rust程式設計WebServer
- Rust 程式設計小專案:WebServer 04Rust程式設計WebServer
- 架構就是上下文 - Eltjo架構
- 關卡設計六要素,提升遊戲體驗的一些構想遊戲
- 文盤rust--使用 Rust 構建RAGRust