2013年10月26日 星期六

Module:製作屬於自己的模組1

剛開始寫Corona SDK的程式時,常會用require匯入別人寫的程式碼。如果我們想要寫出自己的模組的話,要怎麼做呢? 請看下面的文章。

首先在我的文件新增一個資料夾,命名為 ModuleExample1
如下,接著在資料夾裡分別新增main.lua檔案和example1.lua檔案。
寫下如下的程式碼,執行過後在終端機看到結果。




上面的例子裡,example1.lua是被匯入的Module
通常這樣被匯入的檔案,都是會回傳些「什麼東西」。
example1.lua在程式碼的第六行回傳的是一個名叫t的、空的table
而在main.lua的第三行匯入example1的時候,
程式就先跳到example1.lua開始執行匯入,
印出example1.lua has been loaded、最後回傳t
main.lua裡,用變數ex1接住回傳的table
最後用第四行的程式碼,幫這個回傳的table加入新的屬性textVar
textVar的值是 Hello World字串。

---------------------------------------
接著請在main.lua裡面繼續打上下列的程式碼,
並在ModuleExample1的資料夾裡新增scene1.lua檔案,
scene1.lua檔案裡,寫下下圖的程式碼,
執行過後看到結果。

 
main.lua的第六行匯入scene1,開始執行scene1.lua的程式碼。
scene1.lua在第二行再度匯入example1,用變數example1接住回傳值
然後在scene1.lua的第三行印出這個回傳值的testVar變數。
結果我們看到終端機上example1.lua has been loaded並沒有因為又在scene1.lua再度匯入而再多印一次,而居然印出了,我們在main.lua第四行加入的字串Hello World

這是什麼原因呢?
這是因為程式引入Module的時候,如果曾經引入的話,就會紀錄在程式裡package.loaded的地方。即使是重複引入,都還只是會引入一次。再度引入時,程式只會在package.loaded的地方找到原來引入的程式碼來做進一步的處理。

因為這樣,所以第一次在main.lua第三行匯入example1,就印出了example1.lua has been loaded、把回傳的table存到main.lua的變數ex1、並且把這個table存在package.loaded的地方。

main.lua第四行加入新的屬性textVar的時候,不僅main.lua裡面的ex1增加了這樣的屬性、同時package.loaded裡面的table也新加了相同的屬性。

scene1.lua引入了example1.lua時,由於之前程式已經匯入過了,所以不會重新匯入,所以不會再度印出example1.lua has been loaded;由於程式已經匯入過了,所以這時回傳的值,其實是package.loaded裡面的table,於是scene1.lua第三行印出example1.textVar時,會印出Hello World

下篇文章會再談到更多和模組相關的事情。


回到 魏巍的CORONA SDK百科全書

沒有留言:

張貼留言