Corona中文站

强大、易学的跨平台(iOS/Android)开发框架。QQ群1:74390406(满) 群2:221929599

导航

五分钟学会Corona(三) - 基础函数
下面是在可以在corona中使用的,基本的全局函数。出于安全原因,部分Lua标准函数不允许使用。具体,参看本章最后部分 Changes to Lua 。

assert (v [, message])当参数表达式v的结果为false(nil或false),提示一个错误。否则,什么也不作,只是返回所有参数。message参数是错误信息;如调用时忽略这个参数,则默认是“assertion failed”。

error (message [, level])终止当前函数调用,使用message作为出错信息。这个函数不返回值。

通常error会添加一些关于出错位置的信息在message之前。level参数指定如何获取错误位置。level=1(默认),表示出错位置放在error函数被调用的地方。level=2把出错位置放在error被调用的函数的调用出处,也就是上一级函数;其他数字以此类推;level=0,表示避免把出错位置信息放在message里。

_G一个全局变量(不是函数),里面保存着全局环境变量(比如_G._G = _G)。Lua自己并不使用这个变量;改变它的值,并不影响影响其他环境变量,反之则不一定。(如果要改变环境变量,应使用setfenv)。

getfenv ([f])用此函数返回当前环境变量。f可以是一个lua函数、或指定该函数调用栈级别的数字:level 1表示调用getfenv的函数。如果给定的函数,不是一个lua函数,或者如果f是0,getfenv返回全局变量。缺省参数f=1;

getmetatable (object)如果object不包含元表,则返回nil。否则,如果object的元表有一个“__metatable”字段,则返回相关值。否则,返回给定object的元表。

ipairs (t)返回三个值:一个迭代器函数,table t和0,所以这个构造式:

1
for i,v in ipairs(t) do body end


将会枚举名值对集合(1, t[1]), (2, t[2]), ...,直到一个整数key无法在table中找到。

next (table [, index])允许程序遍历table的所有field。它第一个参数是table,第二个参数table的index。next返回table的下一个index和它关联的值。当第二个参数为nil时,next返回初始index和它关联的值。当用最后一个index调用next,或者用nil作为table参数,next函数返回nil。如果第二个参数省略,也就相当于第二个参数填入了nil。实践中,你可以使用next(t)来检测一个table是否为空。

枚举的index的次序不是固定的,即使是数字索引。(为了按照数字顺序遍历table,可以使用一个基于数字的for语句或者ipairs函数)。

如果在遍历期间,你赋任意值到table的不存在的field上,这时候next函数的行为是未定义的。当然你可以修改存在的field的值。实践中,你可清除存在的field。

pairs (t)返回三个值:next函数、table t,以及nil,所以构造式:

1
for k,v in pairs(t) do body end


将会迭代table t的所有名-值对。

在遍历期间修改table详见next函数的注意事项。

pcall (f, arg1, ...)采用保护模式,传递参数来调用函数f。这意味着f里面的任何错误不被传播。相反,pcall捕获了错误,并返回一个状态码。它第一个返回值是状态码(boolean),如果调用成功无误则返回true。在这种情况下,pcall也会返回f函数所有的返回结果,放在第一个返回值后面。一旦有任何错误,pcall将false加错误信息。

print (...)接收任意数量的参数,通过标准输出把它们打印出来。通过tostring函数可以把参数转换成string。print不适用于格式化输出,只是一个快速显示变量的方法,尤其在调试时用。为了格式化输出,可以用string.format。

rawequal (v1, v2)检查v1是否等于v2,而不用调用任何元方法。返回一个布尔值。

rawget (table, index)获得table[index]的真实值,而不用调用任何 metamethod。table参数必须是 table 类型;所以可以是任意值。

rawset (table, index, value)把table[index]设置为一个值,而不调用任何metamethod。 table参数必须是 table 类型;所以可以是任意值,但除了nil。value可以是任何lua值。

该函数返回一个table。

select (index, ...)如果index是一个数字,返回index参数之后的所有参数。否则,index必须是字符串“#”,这时候select返回收到的额外参数的总个数。

setfenv (f, table)设置给定函数使用的环境变量。f可以是一个lua函数,或者一个指定函数调用栈级别的数字:level1是调用setfenv的函数。setfenv返回给定函数。

有一个特殊情况,当f是0,setfenv改变运行线程的环境。这时候setfenv不返回任何值。

setmetatable (table, metatable)用给处的table设置metatable。 (你不能从lua里修改其他类型的元表,C可以)如果metatable 是 nil,则删除给定table的 metatable。如果原始metatable 拥有一个 "__metatable" 字段,则抛出一个错误。

该函数返回一个table。

tonumber (e [, base])尝试把它的参数转化为一个数字。如果这个参数已经是一个数字或一个可转程数字的字符串,tonumber函数会返回一个数字,否则返回nil。

base是一个可选参数,表示数字的进制。base的范围在2-36之间,包括2和36。在10进制中,字母‘A’(无论大小写)将被解释为10,‘B’表示11,以此类推,‘Z’表示35。10进制(默认)可以使用数字也可以用指数形式(见 see §2.1)。在其他进制当中,只能处理无符号整数。

tostring (e)接收一个任意类型的参数,将其按照合理的格式转换成一个字符串。为了完全控制数字转换成字符串的方式,可以使用string.format。

如果e的metatable有“__tostring”字段,那么tostring将会被调用,并把返回的结果作为tostring的结果。

type (v)返回v的类型,返回结果被编码成一个字符串。这个函数的返回结果很可能是“nil”(一个字符串,不是nil值),“number”,“string”,“boolean”,“table”,“function”,“thread”,以及“userdata”。

unpack (list [, i [, j]])返回给定table的所有元素。这个函数等价与于

1
return list[i], list[i+1], ..., list[j]


除了上面这些代码。默认情况下,i=1且j=length(list) (参见 §2.5.5)。



对Lua的修改

这一节是关于在Corona中对lua做出一些修改的描述。

被删掉的函数

F出于安全原因你不能动态的加载原始lua代码。因此下面lua中的标准函数在Corona中将不允许使用:

dofile()

load()

loadfile()

loadstring()

用lua作为一种配置语言

有时候lua脚本被用作一个易于阅读的配置文件。在这种情况下,你把数据存储到lua文件中的lua table中。然而,因为前面提到对lua做出的修改,在Coron里,你将不能动态加载非编译的lua脚本 。相反,我们推荐如下选择:

• 如果table中的数据是静态的,你可以在你的Corona项目中include一个lua文件。

• 如果是动态数据,你可以把lua table序列化到文件中去,或者用一些例如XML的替代格式。

这里有更多的资源:

• Table 序列化. There's Section 12.2 of the Programming in Lua (2nd ed). Also, there's http://lua-users.org/wiki/TableSerialization

• XML. We're not completely satisfied with the options out there, but there are options for lua-based xml parsing: http://lua-users.org/wiki/LuaXml
<< 五分钟学会Corona(二) - 快速入门向导五分钟学会Corona(四) - Images, Shapes, 和Text >>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 Copyright 2011-2015 BuildApp.Net. All Rights Reserved.