教學課程評論

lua-users home
wiki

如果您有任何關於此頁面上教學課程的評論,請隨時提出。如果您是 wiki 新手,建議您參考 Wiki 說明,查看關於如何使用和編輯此 wiki 的說明。

作者備註:如果您有任何批判性的評論,請提出修正批評的方式。例如,如果您認為缺少某個主題或想看到更多範例。請提出正面的建議。如果教學課程的架構和風格很理想,將可進一步延伸(並且作者將覺得自己的努力是有價值的!)。謝謝。

在下方新增評論

Lua 被設計為可移植到許多平台,有些平台沒有視窗,甚至沒有檔案系統。這意味著核心 Lua 不能開啟視窗或掃描目錄,也不能執行任何與作業系統相關的動作。當然,特定平台的 Lua 實作可能會擁有支援此類特定事項的函式庫。您的問題比較適合提問給專門討論特定實作的論壇,因為每個實作的解答都不同。

非常感謝您的回饋。我覺得如果我們大家都開始嘗試建立支援多個版本的頁面,這份 wiki 將會變得非常混亂。我假設當 Lua 的每個「官方版本」發行時,所有內容都會更新,因為沒有理由支援舊內容(因為新的 Lua 更佳!)。我同意如果我們開始提及差異,事情可能會變得混亂。由於我們有一個混和內容網站,因此已經有點混亂了。我們或許應該標記 Lua 4 內容,並在必要和適當時將其更新。我已盡力追求明確性,而且我確信 Lua 使用者可以找出差異。我認為 LuaFiveFeatures 頁面涵蓋所有變更,因此我們會保留它們,或者我應該在某處新增一個連結。--NDT

正確,如 LuaTutorial 說明中所指出:「給想要內嵌 Lua 的程式設計師的說明:請注意,本教學課程的目標在於腳本語言的用法,而非 C API 的內嵌。C API 用法的教學課程可能會在稍後新增。」這樣做的原因在於作者的直接目標受眾是腳本使用者,而不是內嵌者。不過,我希望在語法教學完成後,可以擴充教學課程。在 wiki 上以及各種 Lua 專案中,有許多有關 API 用法的範例,例如 BindingCodeToLuaVectorLibrarySampleSimpleCppBindingSimplerCppBindingLuaCheiaDorisViewer,以及參閱 SampleCode。感謝您的留言。--NDT

注意:本教學針對 Lua 的最新版本(實際上是 Lua 5.2.1)。使用舊版本時,可能會有一些事情起初看起來很奇怪。請參閱 LuaFiveFeatures

它(幾乎完全相同)出現在 LuaTutorial 頁面上,兩次,也在 TutorialExamples 中。我將在 TutorialDirectory 中說明。--NickTrout

感謝並恭賀。Lua 和這個 wiki 真的很好。--Adriano R. Ferreira

由於本教學可能會連結到 wiki 中的其他頁面,你最終可能會複製整個 wiki。JohnBelmonte 的頁面說明如何使用 unix wget 程式產生 wiki 的靜態副本。

這是 Shay 嘗試表達的,但實際上正確的說法是 語法 要求 break(和 return)位於區塊的結尾。這會產生避免無法存取的程式碼的副作用,但有人向我指出,有時候在除錯期間停用部分程式碼會比較好。您無法利用 break 執行此操作,因為這會是語法錯誤。 --RiciLake

這些並非算符。它們是縮寫。 file.lines 代表 file["lines"]file:lines (...) 代表 file.lines (file, ...)。 -- GavinWraith

對,那會很有幫助。有 Lua 5.1 模組系統的概觀教學內容,收錄於「用 Lua 進行程式設計」第二版中 [1]。實際上,章節 15:「模組和套件」是作為線上摘錄提供。那本書評價很高。-DavidManura

請注意,這份教學內容是在 PIL 的第一版出現之前寫成的。它在當時確實滿足重要需求,但現在我幾乎在所有情況下都建議大家優先選擇 PIL,而非這份教學內容。-JohnBelmonte

好,但我認為在我的國家/地區 (巴基斯坦) 中,任何地方都買不到 PIL 2 :(-Shoaib Meenai

不會觸發。在右執行元中,「and」和「or」是非嚴格的,也就是延遲的。

現在我了解執行方式就像這樣:在終端機上執行「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 種方式可以指定這個大小
有關更多詳細資訊,請參閱 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)