教程评论

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

是的,这是必要的。在第二版《Programming in Lua》[1] 中有一个关于 Lua 5.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

手册简要介绍了该库的用途。我们在这里引用它

表库中的大多数函数都假设表表示一个数组或一个列表。对于这些函数,一个重要的概念是数组的大小。有三种方法可以指定该大小
有关更多详细信息,请参阅 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) -- 解包表格”。我遇到了错误。在阅读其他教程(主要是函数教程)后,有一个说明,在 Lua 5.1 之后,table.unpack() 已更改为更简单的 unpack() 函数。鉴于新手会从第一个教程开始 - 您可能需要更正它,或者至少在该代码之后添加一个关于此的说明... 这样他/她就不会浪费时间想知道问题是什么!

最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2014 年 10 月 17 日上午 11:37 GMT (差异)