rust怎么进入好友的房间_Rust基础知识-模块系统(上)
當你開始構建一個大項目的時候,你就能體會到把所有代碼都寫在一個文件里是多么智障了:不僅難以定位負責某一功能的代碼,一大片代碼直接糊你臉上也覺得頭暈。
當然作為一個現代語言,rust也肯定有相應的措施,就是模塊系統。
現在讓我們用一個例子來解釋它!
我們將實現一個能處理某些文件格式的東西。當然,我們只是做示例,并不需要實現具體的功能。只需要讓它輸出一些東西,讓我們知道代碼正常運行就好!
現在它大概如下所示:
fn file_mp4() {output();println!("mp4! "); }fn file_jpg() {output();println!("jpg! "); }fn file_zip() {output();println!("zip! "); }fn output() {println!("output: "); }fn main() {file_mp4();file_jpg();file_zip(); }/** 輸出:** output:* mp4!* output:* jpg!* output:* zip!*/很符合常理是吧?那么接下來我們用模塊重構它:
mod file {pub fn mp4() {output();println!("mp4! ");}pub fn jpg() {output();println!("jpg! ");}pub fn zip() {output();println!("zip! ");}fn output() {println!("output: ");} }fn main() {file::mp4();file::jpg();file::zip(); }/** 輸出:** output:* mp4!* output:* jpg!* output:* zip!*/是不是有點暈?沒關系,讓我們一個一個刨析它。
mod(模塊)
從第一行看起是不是就有些暈?
mod filemod全稱module,也就是模塊。那么顧名思義,mod就是用來聲明一個模塊的。后面緊跟模塊名。
mod內可聲明各種各樣的東西,比如函數。但是如果你曾試過的話,會發現mod內竟能聲明與外部名字相同的函數(或者其他東西)!這其實是因為它們在不同的命名空間(namespace)中。這樣理解嘛,外部是一個房間,mod里面又是一個房間,這兩個房間互不干擾,也就不存在相同名字沖突的問題了。但是這樣問題又來了,如何訪問不同房間中的東西呢?其實從上面的代碼中我們就能獲取到一些信息:
file::mp4(); file::jpg(); file::zip();按照上面的用法來的話就是:模塊名 + 域解析操作符(::) + 要使用的東西
可以看出,域解析操作符就能讓我們訪問到另一個命名空間內的標識符。
pub(可見性)
接著看,第二行后半部分是聲明一個函數,但是前面多了一個pub。
pub fn mp4()pub全稱public,也就是公開的意思。
你可能會想:平時我寫函數也沒加pub,不照樣到處都能用嗎?這個pub有什么意義?
拿上面命名空間的例子:如果別人要訪問你的房間,那你肯定不希望把自己私密的東西讓別人訪問吧,這就是不公開;當然也不可能讓別人訪問了個空氣,所以你可以把那些正常的東西給公開(pub)。
再換到編程里,就是公開那些別人需要用的東西,屏蔽掉內部的細節。
我們可以舉個......啊我們可以直接看上面的代碼:
fn output() {println!("output: "); }這個函數并沒有加pub,意味著它只能在mod內部被調用。在外部即使去用域解析操作符也無法訪問。
咳咳,上面只講了函數pub的內容,所以這里再擴充一下struct和enum的:
先說struct的。struct默認也不公開。但是!只給struct自身加pub是不行的,要想完全公開必須給下面的成員也加上pub,因為即使struct公開了,但是其成員任然是不公開的。
pub struct FileData {pub name: String,pub size: u32, }那這里我們還可以引出一個新問題來!由于可見性規則,其中哪怕有一個成員不公開,我們也無法手動創建這個結構體的具體內容。怎么辦?用構造函數!顧名思義*n,就是提供一個函數來構造這個東西的具體內容嘛。具體實現:
mod file {pub struct FileData {pub name: String,pub size: u32,}impl FileData {pub fn new(name: String) -> FileData {FileData {name,size: 0,}}}// 此處省略其他代碼... }fn main() {let x = file::FileData::new(String::from("err.go"));println!("{}", x.name);}/** 輸出:** err.go*/別忘記加上pub哦!
再是enum。enum與struct有點不同,將自身公開后就可以正常使用。而不是像struct還要公開其成員。具體實現:
mod file {pub enum FileType {mp4,jpg,zip,other, // 其他文件格式}// 此處省略其他代碼... }fn main() {let x = file::FileType::zip; }所以說呢?你這代碼不還是都寫在一個文件里嗎?
所以這就是下章我準備講的內容,敬請期待吧~
P.S. 文章為了對小白保持友好,所以并沒有用難理解的詞匯,即使用了也會給出解釋。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的rust怎么进入好友的房间_Rust基础知识-模块系统(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么看空调定时成功_风管机和中央空调傻傻
- 下一篇: 钱站还款了在账户余额里