解析LUA中關於Package定義學習筆記

來源:互聯網
上載者:User

LUA中關於Package定義學習筆記是本文要介紹的內容,主要是來學習lua中對Package,具體內容倆看本文詳解。Package是個很邏輯的概念。也就是說很可能不是語言直接提供的設施。cpp裡的namespace可以用來實現package,在LUA中則是依靠table機制來實現。實現的方式大同小異,本文總結了在《lua中文手冊》中出現的3種方式。

方式一: 直接將所有組成包的資料和方法定義在包中,代碼看起來像是這樣:

 
  1. vector3d = {}  -- 包名  
  2. function vector3d.function1()  
  3. ......  
  4. end  
  5. function vector3d.function2()  
  6. ......  
  7.       if (vector3d.function1()) then  
  8.       ......  
  9.       end  
  10. end  
  11. return vector3d 

這樣定義的就是一個vector3d包,使用require語言開啟這個包後,就可以使用 vector3d.function1和vector3d.function2這兩個函數了。

這是最直接最好理解的一種Package定義方式,但是有一定的弊端。這個弊端主要體現在Package的實現過程中。可以看到,即使在

vector3d.function2()中使用function1()函數,也必須完整的加上vector3d包名,否則無法進行函數調用。Package的作者要稍微累一點,不過使用者倒是還好。特別的注意最後的 return vector3d 語句,有了這句後調用者可以按照如下方式重新命名包:

 
  1. MyPackage =  require "vector3d"  
  2. MyPackage.function2() 

方式二: 使用局部函數定義所有的Package內函數,然後在Package的結尾處將需要公開的函數直接放入Package中。代碼看起來像這樣:

 
  1. vector3d = {}  -- 包名  
  2. local function function1()  
  3. ......  
  4. end  
  5.  
  6. local function function2()  
  7. ......  
  8.       if (function1()) then  
  9.       ......  
  10.       end  
  11. end  
  12. vector3d = {function1 = functoin1,   
  13. function2function2 = function2  
  14. }  
  15. return vector3d 

最後給包中賦值的部分就是將需要的介面公開的部分。這樣做的好處:不需要公開的函數可以完全隱藏起來(都是local函數);Package內部的各個函數相互之間調用的時候不再需要加Package名稱進行區分; 可以按照需要隨意的重新命名Package公開的介面名稱。這種方式的弊端在於定義的時候需要寫上local,這算不算弊端就看你了 - -。 就我個人而言,我還是比較喜歡這個定義方式。能明確的區分出介面和私人的定義,公開介面的名稱還可以隨意改變,這就意味著可以隨意替換內部實現而不需要影響外部調用者。

無論用什麼方法去定義Package,都是為了在邏輯上更好的規劃代碼層次。LUA中的table機制的確是一個活力無限的機制啊。Package依靠這個實現,LUA本身自己有些機制也依賴於Table(比如全域變數就放在_G表中)

手冊裡還有個如何"拆開"Package的程式碼片段,很好的展現了table的強大之處(Package也是在table上構築的邏輯產物)。將Package拆開的意思,就是將所有 Package中公開的名字放入_G表中。也就是讓 Package.A() 變成_G.A  (_G在一般情況下不需要寫,預設引用了)

 
  1. function openpackage (ns)  
  2.       for n,v in pairs(ns)   
  3.      do  
  4.             _G[n] = v  
  5.      end  
  6. end 

小結:解析LUA中關於Package定義學習筆記的內容介紹完了,希望通過本文的學習能對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.