如果您有任何關於此頁面上教學課程的評論,請隨時提出。如果您是 wiki 新手,建議您參考 Wiki 說明,查看關於如何使用和編輯此 wiki 的說明。
作者備註:如果您有任何批判性的評論,請提出修正批評的方式。例如,如果您認為缺少某個主題或想看到更多範例。請提出正面的建議。如果教學課程的架構和風格很理想,將可進一步延伸(並且作者將覺得自己的努力是有價值的!)。謝謝。
在下方新增評論
- 個人認為現有的教學課程很棒,但我想看一個基本範例,例如如何開啟視窗。這可能對某些能力較強的編碼人員來說很簡單,但對於才剛入門的人來說會很有幫助。
- Lua 被設計為可移植到許多平台,有些平台沒有視窗,甚至沒有檔案系統。這意味著核心 Lua 不能開啟視窗或掃描目錄,也不能執行任何與作業系統相關的動作。當然,特定平台的 Lua 實作可能會擁有支援此類特定事項的函式庫。您的問題比較適合提問給專門討論特定實作的論壇,因為每個實作的解答都不同。
- 如果每個頁面的底部都有連結可以轉到下一個/上一個主題,會很有用。這將讓(我嗎?)更有效率地閱讀/掃描 wiki 的內容。 --JimE
- 我對編程還相當陌生,首先我要說到目前為止我所讀到的內容(所有入門教學課程)都非常清晰且易於理解。然而,我在表達式教學課程中有種感覺,我錯過了理解其中部分內容所需的知識。具體來說,我指的是運算子「或」,以及它如何實作到函式中。我不認為之前的教學課程中有提到過「區域變數」等內容,我在討論「或」的部分中發現其他內容也令我感到困惑。在那方面有更多的說明會很好。抱歉,這可能有點吹毛求疵,但當我不瞭解某件事時,我會覺得自己錯過了應該知道的很多資訊。謝謝。
- 非常需要的內容以易於閱讀的格式呈現。我衷心希望內容能持續集中在 Lua 5.0,而不是討論不同於先前版本的差異(除非這能幫助到經驗豐富的 Lua 編程人員)。我的建議是將所有(即 Lua 5.0)教學課程的頁面連結移到一個新的頁面上,標題為 Lua 5.0 教學課程。謝謝。
- 非常感謝您的回饋。我覺得如果我們大家都開始嘗試建立支援多個版本的頁面,這份 wiki 將會變得非常混亂。我假設當 Lua 的每個「官方版本」發行時,所有內容都會更新,因為沒有理由支援舊內容(因為新的 Lua 更佳!)。我同意如果我們開始提及差異,事情可能會變得混亂。由於我們有一個混和內容網站,因此已經有點混亂了。我們或許應該標記 Lua 4 內容,並在必要和適當時將其更新。我已盡力追求明確性,而且我確信 Lua 使用者可以找出差異。我認為 LuaFiveFeatures 頁面涵蓋所有變更,因此我們會保留它們,或者我應該在某處新增一個連結。--NDT
- 需要 C 範例。特別是,我要如何將參數傳遞給 lua 腳本、取得回傳值,以及如何註冊一個要從 lua 腳本呼叫的 C 函數,以及如何從 C 呼叫 lua 腳本函數?我在此處看到的所有內容都集中在 lua 語法上。
- 正確,如 LuaTutorial 說明中所指出:「給想要內嵌 Lua 的程式設計師的說明:請注意,本教學課程的目標在於腳本語言的用法,而非 C API 的內嵌。C API 用法的教學課程可能會在稍後新增。」這樣做的原因在於作者的直接目標受眾是腳本使用者,而不是內嵌者。不過,我希望在語法教學完成後,可以擴充教學課程。在 wiki 上以及各種 Lua 專案中,有許多有關 API 用法的範例,例如 BindingCodeToLua、VectorLibrarySample、SimpleCppBinding、SimplerCppBinding、LuaCheia、DorisViewer,以及參閱 SampleCode。感謝您的留言。--NDT
- 我只想提出一些正面的回饋。找到關於如何將 Lua 和 C++ 相互繫結的範例程式碼真是太好了,而且對進一步調查 Lua C API 來說,這是一個很好的起點。我在文件檔中找到了不少資訊,但是良好的範例是我真正理解發生了何事的最佳方式。謝謝。--Andreas
- 我初次接觸 Lua 程式語言,而這個 wiki 真的是非常有用。我在上面讀了不要試圖涵蓋 Lua 所有版本的好處,而是專注於目前的版本 (5.2.1),不過這樣做會不會在教學中明確表達?我的第一次嘗試帶領我到 DJGPP 的 Lua 4.0 編譯,當我試著遵循教學時,我立刻發現了差異:(1) 不支援
= expression
,(2) true
及 false
是未定義的,會變成 nil
。這一開始讓我嚇到了,後來我發現使用 Lua 5.0 真的很必要。如果教學在顯眼處包含這些內容該有多好
- 注意:本教學針對 Lua 的最新版本(實際上是 Lua 5.2.1)。使用舊版本時,可能會有一些事情起初看起來很奇怪。請參閱 LuaFiveFeatures。
- 它(幾乎完全相同)出現在 LuaTutorial 頁面上,兩次,也在 TutorialExamples 中。我將在 TutorialDirectory 中說明。--NickTrout
- 感謝並恭賀。Lua 和這個 wiki 真的很好。--Adriano R. Ferreira
- 我剛開始學習 lua,而且我覺得將整個教學匯集成可下載的格式會很有用。這樣做得到嗎?-- Arun
- 由於本教學可能會連結到 wiki 中的其他頁面,你最終可能會複製整個 wiki。JohnBelmonte 的頁面說明如何使用 unix
wget
程式產生 wiki 的靜態副本。
- 整體來說,我覺得本教學非常直接了當。我喜歡能夠以互動模式執行
lua
及立即進行實驗。我欣賞 wiki 頁面簡單而精簡的排版。以下為回饋。--ShayGreen? --你的深思熟慮的意見讓我獲益良多,非常感謝。--Nick
- 明確說明什麼是區塊,以及區塊在什麼地方可以換行(再次說明,我可能錯過說明這方面的部分)。
- 公平的意見,關於區塊的編排和使用並沒有什麼特別的說明。或許你想新增這個教學頁面?或許稱為
CodeBlockTutorial?
-- NickTrout
- 不過這並不是 wiki 的運作方式。有一些順序,但只在索引頁面中。wiki 中其他頁面有連結到適當的頁面。隨著時間的推移,wiki 會演化,而「下一頁」可能不再有意義。-- NDT
- 在 ControlStructureTutorial 中,這項註解並未立即清楚:我們可以使用
break
關鍵字離開 while
語句的控制。break
關鍵字必須是區塊中的最後一項語句,即關鍵字 end
必須緊接在後。例如... 對我來說,這會清楚一點:...如果在區塊中使用 break
,它必須是 end
關鍵字之前該區塊中的最後一項語句,因為 break
之後的所有內容都無法存取。
- 我不認為我們在這裡陳述了相同的內容。在 Lua 中,您不能在中斷後執行額外命令,因為這會產生編譯錯誤。--NDT
- 我想 Shay 嘗試在此處表達的是「您會在此處收到編譯錯誤,*因為* 在
break
之後的所有內容 *會是* 無法存取的」。 - 如果產生的編譯錯誤較為有幫助(即
'end' expected after 'break'
,而非 'end' expected near 'some_symbol'
),我們可以完全移除這方面的說明 --PeterPrade
- 這是 Shay 嘗試表達的,但實際上正確的說法是 語法 要求
break
(和 return
)位於區塊的結尾。這會產生避免無法存取的程式碼的副作用,但有人向我指出,有時候在除錯期間停用部分程式碼會比較好。您無法利用 break
執行此操作,因為這會是語法錯誤。 --RiciLake
- 本文多次提到「函式原型」,這對非 C 背景的人來說很奇怪。[...] 最好將「函式原型」換成「函式宣告」 -- AndreiFormiga?
- 感謝您的回饋,Andrei。我已移除函式原型的相關內容,並使用較為通用的語言取代。--NDT
- 我找不到任何關於 ':' 算符執行的說明,與 '.' 有何不同,例如 file:lines 與 file.lines -- 困惑
- 這些並非算符。它們是縮寫。
file.lines
代表 file["lines"]
。 file:lines (...)
代表 file.lines (file, ...)
。 -- GavinWraith
- 我發現教學課程的某些部分仍舊進行中。然而,我想知道未來教程是否會有「非維基化」版本。換句話說,社群是否有興趣在另一個不可編輯的網站鏡像教學課程?這類似於 Python 使用者呈現教學課程的方式,且 Lua 版本切換時或許能減少困惑,例如針對每個版本量身訂做的教學課程可以「凍結」。這也有不能收到垃圾郵件的優點。--xlthlx
- 教得很棒的教學內容。我希望有一則與 CGILua 相同等級的教學內容,因為我想主要使用 Lua 來開發網站。我認為 Lua 可以輕鬆超越 PHP / Perl 的執行效能。謝謝 Nick Trout!-Duke
- [有人] 可以增加一個章節說明 Lua 5.1 的模組系統嗎?這樣會很有幫助。-Shoaib Meenai
- 對,那會很有幫助。有 Lua 5.1 模組系統的概觀教學內容,收錄於「用 Lua 進行程式設計」第二版中 [1]。實際上,章節 15:「模組和套件」是作為線上摘錄提供。那本書評價很高。-DavidManura
- 請注意,這份教學內容是在 PIL 的第一版出現之前寫成的。它在當時確實滿足重要需求,但現在我幾乎在所有情況下都建議大家優先選擇 PIL,而非這份教學內容。-JohnBelmonte
- 好,但我認為在我的國家/地區 (巴基斯坦) 中,任何地方都買不到 PIL 2 :(-Shoaib Meenai
- 由於時間都花在說明輸出值是什麼,ExpressionsTutorial 應說明「and」和「or」是短路運算。也就是說,如果 foo() 有副作用 (例如列印輸出),像「1 or foo()」或「nil and foo()」這樣的表達式會觸發副作用嗎?
- 不會觸發。在右執行元中,「and」和「or」是非嚴格的,也就是延遲的。
- 我認為這是非常棒的教學內容。但由於這份教學內容適合 (像我這樣) 沒有太多撰寫腳本語言經驗的人,會希望在開始時 (例如在 TutorialExamples) 說明如何將腳本寫入編輯器中,並透過呼叫這個檔案來一次執行所有指令。我猜我可以透過在「>」符號之後呼叫檔案 (像是呼叫函式那樣) 來執行此檔案的指令。我會繼續閱讀教學內容,或許可以在後面的章節找到答案。(我在 Lua 控制台中使用 Lua。到目前為止,我無法讓 luaeclipse (Eclipse 的 Lua 外掛程式) 正常執行。我使用的作業系統是 Linux,所以很歡迎能提供有推薦給 Lua 使用的良好 IDE 的建議。)
- 現在我了解執行方式就像這樣:在終端機上執行「lua filename」(不含引號),就可以正常執行。如果教學內容中直接寫出會更好。我稍後會進行更改。
感謝如此完整的教學內容。編排得很棒,而且有助於快速了解這門語言。在 TableLibraryTutorial 章節中,由於我了解到許多其他章節也有相同問題,所以以下部分對最新的 Lua 版本 (5.2) 無效。可以提供並說明以下範例程式碼要如何變更,才能適用於最新版本的發行版本嗎?
table.sort(table [, comp])
> t = { 3,2,5,1,4; n=3 } -- construct a table with user size of 3
> table.sort(t) -- sort will be limited by user size
> = table.concat(t, ", ") -- only specified size is concatenated as well
2, 3, 5
舊材料
因為缺乏更好的東西,這裡有些從 Lua 5.1 教程中刪除的舊 Lua 5.0 東西。
collectgarbage([limit])
設定垃圾收集器會被呼叫的記憶體配置上限。如果新上限低於 Lua 目前的記憶體配置數量,或是沒有給出引數,那收集器會立刻被呼叫。有關更多資訊,請參閱 GarbageCollectionTutorial。
> = gcinfo() -- find current memory stats, i.e. 21kb used
21 35
> bigalloc = string.rep('a', 100000) -- create a big string
> = gcinfo() -- 164kb allocated now
164 327
> collectgarbage() -- force collection
> = gcinfo() -- we did free some memory on collection
139 278
> bigalloc = nil -- release the string we created
> = gcinfo() -- it's not deleted until its collected
140 278
> collectgarbage() -- collect
> = gcinfo() -- it's deleted
29 59
gcinfo()
- 工作項目:傳回兩個結果:Lua 使用的動態記憶體 (K 位元組) 數量和目前的垃圾收集器臨界值 (也是 K 位元組) 數量。
loadlib(libname, funcname)
這個函式會將程式連結到動態 C 函式庫「libname
」。它會在這個函式庫內尋找一個函式「funcname
」並傳回這個函式,做為一個 C 函式。libname
必須是 C 函式庫的完整檔名,包括任何可能的路徑和副檔名。此函式不支援 ANSI C。因此,它僅在某些平台上可用 (Windows、Linux、Solaris、BSD,外加其他支援 dlfcn 標準的 Unix 系統)。
loadlib
讓你能夠透過自己撰寫的 C 函式,加強你的 lua 指令碼。如果你想要實作你自己的東西,下列範例應該能給你一些提示。這一段已經在 Linux 上測試過,但應該也可以執行在其他平台上。你應該要懂如何建立共用物件函式庫。範例中所有的檔案都應該在同一個目錄裡。
/* mylib.c might look like this: */
#include "lua.h"
#include "stdio.h"
/* This function will be exported to lua */
static int lua_myfunc(lua_State* l)
{
printf("blabla");
return 0;
}
/* This function is our Initialization */
int init(lua_State* l)
{
printf("Registering personal functions");
lua_register(l, "myfunc", lua_myfunc);
printf("Done registering");
return 0;
}
現在把它編譯成一個函式庫 (在 *nix 或 Cygwin 中)
gcc -Wall -g -O2 -shared `lua-config --include` -c mylib.c -o mylib.o
gcc mylib.o -Wall -g -O2 -shared `lua-config --include` `lua-config --libs` -o mylib.a
這樣之後你應該會有一個叫做 mylib.a
的檔案,這就是我們的函式庫。現在讓我們用 lua 寫一個簡單的測試指令碼
luainit = loadlib("./mylib.a", "init")
-- now call the initialization routine
luainit()
print("New registered function: " .. myfunc)
-- start the new function
myfunc()
print("well done.")
- 你可以透過這個範例作者取得電子郵件支援 @ reflex-2000 <aat> gmx < dottt> net
math.mod
將第一個引數除以第二個引數,然後傳回餘數。
> = math.mod(7,3)
1
> = math.mod(9,3)
0
> = math.mod(100,2.3)
1.1
表格函式庫已在參考手冊的第 5.4 節中說明。TablesTutorial 中有更多關於表格的詳細資訊。手冊簡潔地說明了這個函式庫的用途。我們會在這裡引用它
- 表格函式庫中的大部分函式,都假設表格表示一個陣列或清單。對於這些函式而言,一個重要的概念是陣列大小。有 3 種方式可以指定這個大小
- 「
n
」欄位 - 當表格有一個數值為「n
」的欄位時,這個值便視為其大小。 -
setn
- 你可以呼叫 table.setn()
函式來明確設定表格的大小。 - 隱含大小 - 否則,物件大小會是具有
nil
值的第一個整數索引減 1。
- 有關更多詳細資訊,請參閱
table.getn()
和table.setn()
函式的說明。
註解:表格的大小不一定會反映在表格中所含元素的數量。這看起來似乎有點奇怪,但它可能很好用,例如,維護非順序列表。
table.getn(table)
- 已標示為 length 算子 # 的非建議使用方式這用來確定表格的大小。表格的大小在這個頁面的最上面有討論。
> = table.getn({1,2,3}) -- Lua will count the elements if no size is specified
3
> = table.getn({1,2,3; n=10}) -- note, n overrides counting the elements
10
> t = {1,2,3}
> table.setn(t, 10) -- set our own size with setn()
> = table.getn(t)
10
> = table.getn({1,2,3,nil,5,6}) -- sequence ends at element 3 due to nil value at 4
3
table.setn(table, n)
設定表格的大小(請參照表格大小和此頁面的最上方的註解)。如果表格有值「n
」,它會更新,例如,
> t = { 1,"two","three"; n=10 } -- create a table which has a user size specified
> = table.getn(t) -- read the size
10
> table.foreach(t, print) -- display the elements of the table
1 1
2 two
3 three
n 10
> table.setn(t, 12) -- use setn to change the size
> = table.getn(t) -- display the size
12
> table.foreach(t, print) -- display the table contents
1 1
2 two
3 three
n 12
如果表格沒有鍵值為 n
的元素,表格的大小會內部儲存。
> t = { 1,"two",3,4 } -- no "n"
> = table.getn(t) -- calculate the size of the table
4
> table.setn(t, 10) -- set the size to a user defined value
> = table.getn(t) -- find the size
10
> table.foreach(t, print) -- look at the table contents
1 1
2 two
3 3
4 4
小註解:在「函式」區段的「類型教學手冊」中,你有個程式碼行「table.unpack(tata) -- 解開表格」。我收到一個錯誤。在瀏覽其他教學手冊後(主要是函式教學手冊),有個註解說明在 Lua 5.1 之後,table.unpack() 已變更為更簡潔的 unpack() 函式。考量到新手會從第一個教學手冊開始 - 你可能想要更正它,或至少在該程式碼後新增一個說明這個變更的註解... 這樣他/她就不會浪費時間在想問題是什麼!
最新更新 · 喜好設定
編輯 · 記錄
最後編輯時間:2014 年 10 月 17 日 上午 11:37 (GMT) (diff)