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