匿名
未登录
讨论
暗色模式
贡献
创建账号
登录
滚动的天空Wiki
搜索
编辑“
Help:Lua
”(章节)
来自滚动的天空Wiki
命名空间
帮助
讨论
更多
更多
语言
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
页面操作
阅读
编辑源代码
历史
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
== 数据类型 == Lua是动态类型语言,变量没有类型,只有值有。声明局部变量、函数参数等,均无需声明类型。 === 基本类型介绍 === 在Scribunto扩展中,Lua只有6个基本的类型: ==== nil ==== '''空值(nil)'''表示这个值不存在。尝试访问不存在的变量或表中不存在的字段的值时,会得到nil。函数调用中未提供的参数的值都会被视为nil。很多函数也会在失败时返回nil而不是抛出错误,例如tonumber函数在无法转换成数字时会返回nil。 ==== boolean ==== '''布尔值(boolean)'''只有true或false。将其他数据类型转化为布尔值时,只有false和nil视为false,其他的一律视为true。 ==== string==== '''字符串(string)'''为一系列的8比特字节;这取决于应用程序以哪种特定的编码来解析。字符串使用单引号或双引号表示,单引号和双引号无区别,也不会区分“字符”与“字符串”。字符串可以转义。 字符串也可以使用长括号来定义。长括号之间可以夹杂着0个或更多个等号(两边的等号要等量)。例如,{{code|"abc"|lang=lua}}、{{code|'abc'|lang=lua}}、{{code|[[abc]]|lang=lua}}、{{code|code=[==[abc]==]|lang=lua}}都是等价的。注意:由长括号定义的字符串'''可以直接换行,且不会处理转义序列'''。 Lua标准库中的[[Help:Lua/string|string库]]可用于处理字符串,MediaWiki库中的[[Help:Lua/mw.text|mw.text]]和[[Help:Lua/mw.ustring|mw.ustring]]则提供了更多的处理方法。 ==== number ==== Lua中的'''数字(number)'''均为双精度浮点数,-9007199254740992到9007199254740992之间的整数都会准确表达,更大的数和带有小数部分的数将会受到舍入的误差。 数字可以用点(.)来表示小数,例如123456.78。数字也可以用不带空格的科学计数法,例如1.23e-10、123.45e20或者1.23E5。也可以用16进制表示整数,方法就是以0x开头,例如0x3A。 1/0会得到inf,0/0会得到nan。inf和nan都可以正确地储存,但是并无直接的文字表示方法(无穷大可以使用<code>math.huge</code>表示)。使用时,应当留意inf和nan可能带来的潜在错误。nan不等于它自己,也就是说,'''<code>nan == nan</code>会返回false'''。 Lua标准库中的[[Help:Lua/math|math库]]可用于处理数字。 ==== table ==== '''表(table)'''是复合数据类型,是Lua中最复杂的一种数据类型,很像JavaScript中的对象(object)或者Python中的字典(dict)。在Lua中,表同时充当了映射、列表、集合的功能。 表由多个(或者零个)字段组成,每个字段都有'''键(key)'''和'''值(value)''',其中键可以是除nil或nan外的任何值。不存在的字段可视为其值为nil。键是唯一的,值不是唯一的。若键为表或函数,则判断其唯一性是根据其是否为同一个对象。 声明一个表的方法是:在一组花括号中,使用“[键] = 值”的方式表示一个字段,多个字段使用逗号或分号隔开。如果键是字符串的字面量,且该字符串符合变量名称要求,则可以省略引号并使用“键 = 值”的方式表示。例如,{{code|code={a = 1, b = "2"}|lang=lua}}中,{{code|"a"|lang=lua}}和{{code|"b"|lang=lua}}都是键,{{code|1|lang=lua}}和{{code|"2"|lang=lua}}是对应的值,也可以表示为{{code|code={["a"] = 1, ["b"] = 2}|lang=lua}}。 声明一个表时,键是可以省略的。例如,{{code|{"a", "b", "c", "d", "e"}|lang=lua}}等价于{{code|code={[1]="a", [2]="b",[3]="c", [4]="d", [5]="e"}|lang=lua}},这样的表称为'''数组(array)'''或'''序列(sequence)''',其特点就是键是连续不间断的正整数。空表也可以视为数组 对于表t和数字b,如果满足{{code|code=(t == 0 or t[b] ~= nil) and t[b + 1] == nil|lang=lua}},则称b为表t的一个'''边界(border)'''。数组只有一个边界。有多个边界的表不是严格的数组,称为'''稀疏数组(sparse array)''',对其进行取长运算会返回其中一个边界,存在不确定性。例如,{{code|code={nil, 2, 3, nil, nil, 6} }}是个稀疏数组,其边界为0、3、6,因此其长度可能是0、3、6中的某一个值。 表也可以用作'''集合(set)''',如{{code|code={a = true, b = true, c = true}|lang=lua}},因为键是不能重复的,所以可以通过判断键对应的值是否存在来判断集合是否包含某个元素。 '''表的字段访问:'''可以通过“<code>-{}-变量名称[键]</code>”或“<code>-{}-变量名称.键</code>”(该方法的键必须是可作标识符的字符串)的方式来访问表中的键对应的值,也就是说,找到一个键为指定的值(表、函数等需要是同一对象,字符串、数字等只需要值相等即可)的字段,并返回其值。例如,如果t是一个表,则{{code|code=t[true]|lang=lua}}表示布尔值键true对应的值,{{code|code=t.abc|lang=lua}}或{{code|code=t["abc"]|lang=lua}}表示字符串键{{code|"abc"|lang=lua}}对应的值。如果这个值不存在,返回nil。 '''表的字段赋值:'''可以通过赋值语句修改表中的键对应的值。可以给表添加字段、修改现有字段的值或者清除一个字段。例如,{{code|code=t[true] = "q"|lang=lua}}表示将键true对应的值修改为字符串"q",{{code|code=t["abc"] = nil|lang=lua}}或{{code|code=t.abc = nil|lang=lua}}(该方法的键必须是可作标识符的字符串)表示将键{{code|"abc"|lang=lua}}对应的值修改为nil(相当于删除这个字段,如果其原来的值不是nil的话)。注意:键可以是除nil或nan外的任意值,可以是函数、表,甚至是表自身,也就是说{{code|code=t[print] = 1|lang=lua}}、{{code|code=t[t] = t|lang=lua}}这样的用法都是有效的,而{{code|code=t[0/0] = 1|lang=lua}}则是无效的(0/0相当于nan,参考[[#number]])。 表不会自动复制。例如如果t是一个表,则赋值语句{{code|code=s = t|lang=lua}}'''不会将t的内容复制到新的表s中,而是会让变量s和t的指针都指向同一个内存空间,它们仍是同一个对象''',对表s的修改和对t的修改是同步、等价的。 Lua中,判断两个表是否相等的标准是两个表是否'''是同一个对象''',而不是内容是否一致。例如,在上面这一段的例子中,{{code|code=s == t|lang=lua}}就会返回true,而{{code|code={} == {}|lang=lua}}会返回false。一般来说,每对花括号都意味着创建了一个新的对象。 Lua标准库中的[[Help:Lua/table|table库]]可用于处理表,其中大部分函数都是用于处理数组(表中的数组部分)的。此外,本wiki也搬运了元模块[[Module:TableTools|TableTools]],可用于对表进行一些高级的处理。 此外,表的索引、赋值、判断相等等操作都可以受到[[#元表]]影响。 ==== function ==== Lua中的'''函数(function)'''是'''闭包''',这意味着它们维护对它们声明的作用域的引用,并可以访问和操作该作用域中的变量。 定义一个函数的基本语法是: <syntaxhighlight lang=lua> function 函数名称(参数列表) 语句…… end </syntaxhighlight> 函数名称可以是表的字段,例如t.abc。或者,你也可在function前面加上{{code|local|lang=lua}}关键字,表示该函数是个局部变量。参数是可选的,且视为局部变量。定义函数时,可以使用{{code|...|lang=lua}}表示不定数量的参数(参见[[Help:Lua/基本#select|select]])。 函数内可以使用return语句,表示函数返回一个值,return语句后面应当紧跟代码块的结束。如果没有执行return语句,函数不会返回值,可以认为返回了nil。 匿名函数的表示方法为: <syntaxhighlight lang=lua> function (参数列表) 语句…… end </syntaxhighlight> 匿名函数与普通的函数无区别,例如,下面两个语句的效果是一样的: * {{code|code=local function f(x) return x+1 end|lang=lua}} * {{code|code=local f = function (x) return x+1 end|lang=lua}} 注意:通过匿名函数赋值的方式定义的函数,如果需要在函数内调用函数自身,应当先声明再赋值。例如: * 正确:{{code|code=local function f(x) return x < 5 and f(x + 1) or x end|lang=lua}} * 错误:{{code|code=local f = function (x) return x < 5 and f(x + 1) or x end|lang=lua}}(这里的f(x+1)中的f视为全局变量) * 正确:{{code|code=local f; f = function (x) return x < 5 and f(x + 1) or x end|lang=lua}} 事实上,在Lua中,{{code|local function f(...)|lang=lua}}是一个语法糖,在字节码中,实际上是先声明局部变量再赋值的。 调用函数的语法为: <syntaxhighlight lang=lua> 函数名称(参数列表) </syntaxhighlight> 函数的调用可以单独作为语句,也可以作为表达式。此外,如果调用函数时(无论作为语句还是表达式),只有一个参数,且该参数为字符串或表的字面量,则括号可以省略,例如: * {{code|print "abc"|lang=lua}}等价于{{code|print("abc")|lang=lua}}。 * {{code|print{1, 2, 3}|lang=lua}}等价于{{code|print({1, 2, 3})|lang=lua}}。 Lua的函数不支持方法重载或多重派发,也不能够直接给参数设置默认值。调用函数时,缺失的参数视为nil<ref>如果函数有不定数量的参数,则这些参数的数量是准确的;此外一些Lua内置函数也不会补充参数,例如{{code|tostring()|lang=lua}}会抛出错误,而不是理解为{{code|tostring(nil)|lang=lua}}。</ref>,多余的参数会被忽略。一种常见的间接设置默认值的方式是,检查某个参数的值是否存在,如果为nil则赋值为默认值,例如: <syntaxhighlight lang=lua> function f(name) name = name or 'default' ... end </syntaxhighlight> ===== 方法 ===== 函数作为表的字段时可以作为'''方法(method)'''调用,会自动将表自身作为第一个参数。方法是'''面向对象'''的一种体现。 Lua并没有严格意义上的方法,但Lua提供了下面两种语法糖: * 声明方法:{{code|function table:method(args)|lang=lua}}等价于{{code|function table.method(self, args)|lang=lua}}; * 调用方法:{{code|table:method("foo")|lang=lua}}等价于{{code|table.method(table, "foo")|lang=lua}}。 此外,字符串也可以面向对象使用(参见[[#元表]])。 === 类型转换 === Lua的数据类型可以相互转换。 [[Help:Lua/基本#tonumber|tonumber]]函数可以将字符串转化为数字,例如{{code|tonumber("123")|lang=lua}}会返回123。不能转化为数字的,则会转化为nil。对字符串进行算数运算时会尝试自动转换成数字。 [[Help:Lua/基本#tostring|tostring]]函数可以将任意值转化为字符串。表会转化为{{code|"table"|lang=lua}}(受[[#元表]]影响的除外),函数会转化为{{code|"function"|lang=lua}}。数字与字符串连接、数字之间连接时会自动转换成字符串。 [[Help:Lua/基本#type|type]]函数可以返回值的数据类型,用字符串表示。例如{{code|type(1/0)|lang=lua}}会返回{{code|"string"|lang=lua}},{{code|type(true)|lang=lua}}会返回{{code|"boolean"|lang=lua}}。
摘要:
请注意您对滚动的天空Wiki的所有贡献都被认为是在Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)下发布,请查看在
Project:版权
的细节。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)
Cookie帮助我们提供我们的服务。通过使用我们的服务,您同意我们使用cookie。
更多信息
确定
导航
导航
首页
最近更改
随机页面
所有页面
帮助
格式
互助客栈
Wiki条例
管理员告示板
工具
导入页面
展开模板
创建或编辑任意页面
参数设置
Wiki工具
Wiki工具
特殊页面
页面值
获取缩短的URL
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志
其他项目
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體