教程评论

lua-users home
wiki

请随时在本页面上对教程发表评论。如果您是第一次使用维基,您可能想查看 WikiHelp,了解如何使用和编辑本维基的一些技巧。

作者注: 如果您有任何批评意见,请提出修正建议。例如,如果您认为某个主题缺失,或者您希望看到更多示例。也请多发表正面评价。如果您喜欢教程的结构和风格,那么它可以进一步扩展(作者也会觉得自己的努力是值得的!)。谢谢。

在此下方添加评论

Lua 被设计成可移植到许多平台,其中一些平台没有窗口,甚至没有文件系统。因此,核心 Lua 不能打开窗口或扫描目录,或任何特定于操作系统的事情。当然,特定平台的 Lua 实现可能有处理这些特定问题的库。您的问题最好在专门讨论特定实现的论坛上提问,因为每个平台都有不同的答案。

非常感谢您的反馈。我有一种感觉,如果我们都开始尝试让页面支持多个版本,这个维基会变得非常混乱。我想,当每个“官方版本”的 Lua 发布时,所有内容都会更新,因为没有理由支持旧内容(因为新的 Lua 更棒!)。我同意如果我们开始提及差异,事情会变得混乱。这个混合内容站点已经有点混乱了。我们应该为 Lua 4 的内容打上标记,并在必要时进行更新。我一直努力追求清晰,我相信 Lua 用户可以自己弄清楚这些差异。我认为 LuaFiveFeatures 页面涵盖了任何变化,所以我们将把它们留在那里,也许我应该在某个地方添加一个链接。--NDT

正确,正如 LuaTutorial 注释中所指出的:“给想嵌入 Lua 的程序员的注意:请注意,本教程旨在用于脚本语言的使用,而不是用于嵌入的 C API。未来可能会添加一个用于使用 C API 的教程。”之所以这样,是因为作者的直接目标受众是脚本用户,而不是嵌入者。不过,一旦语法教程完成,我希望将来扩展本教程。维基以及各种 Lua 项目中有许多 API 使用的示例,例如 BindingCodeToLuaVectorLibrarySampleSimpleCppBindingSimplerCppBindingLuaCheiaDorisViewer,以及 SampleCode。感谢您的评论。--NDT

注意。 本教程面向 Lua 的当前版本(实际上是 Lua 5.2.1)。使用旧版本时,某些内容可能起初看起来有些奇怪。请参阅 LuaFiveFeatures

这在 LuaTutorial 页面上已经说了(几乎完全一样),而且在 TutorialExamples 中也说了两次。我会在 TutorialDirectory 中添加一个说明。--NickTrout

谢谢并祝贺。Lua 和这个维基都非常好。--Adriano R. Ferreira

由于教程可能包含指向维基中其他页面的各种链接,您最终可能需要复制整个维基。JohnBelmonte 的页面展示了如何使用 Unix 的 wget 工具制作维基的静态副本。

这就是 Shay 试图说的,但实际上说 break(和 return)必须位于块的末尾才是正确的。这会避免代码不可达的副作用,但正如有人提醒我的,有时在调试时禁用一些代码会很好。你不能用 break 来做到这一点,因为这会是语法错误。 --RiciLake

这些不是运算符。它们是缩写。 file.lines 代表 file["lines"]file:lines (...) 代表 file.lines (file, ...)。-- GavinWraith

是的,这是需要的。第二版《Lua 编程》中有对 Lua 5.1 模块系统的良好介绍 [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 正在使用的动态内存的千字节数和当前的垃圾收集器阈值(也以千字节为单位)。


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 中找到。

手册对该库的用途非常简洁。我们将在此引用

表库中的大多数函数都假定表代表一个数组或列表。对于这些函数,一个重要的概念是数组的大小。有三种方法可以指定大小
有关更多详细信息,请参阅 table.getn()table.setn() 函数的说明。

注意: 表的大小不一定反映表中包含的元素数量。这可能有点奇怪,但例如,它可用于维护非顺序列表。


table.getn(table)

- 已弃用,使用长度运算符 #

这用于确定表的大小。表的大小在本页顶部讨论。

> = 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) -- unpack the table”。我收到一个错误。在仔细阅读了其他教程(主要是函数教程)之后,有一条说明,在 Lua 5.1 之后,table.unpack() 已更改为更简单的 unpack() 函数。考虑到新手会从第一个教程开始,您可能想纠正它,或者至少在那段代码后添加一个关于此事的注释……这样他就/她就不会浪费时间去猜测问题所在了!

RecentChanges · preferences
编辑 · 历史
最后编辑于 2014 年 10 月 17 日 05:37 GMT (差异)