ps:小编是一名cocos2d学习者(不能说是开发者,毕竟小编还是处于学习过程),前段时间小编是学习的cocos2d-x的,但是由于市面上大部分公司采用了lua的开发模式,因此小编不得不往cocos2d-lua方向转。由于小编是初学者,因此记录的只是我学习过程中的遇到的问题。
table是lua中最重要的一种数据类型(准确的不应该称为类型,用集合更加形象的说明,或者是一个关联数组)。
关联数组:就是采用索引index-value模式,将索引(除nil的任何类型,因此table可是采用嵌套)和对应的值相关联。
创建: a = {} / a={1="first", 2 = "second", "a" = 3}; tabel是一种动态分配的对象,程序仅持有一个对它的引用或指针,因此创建的时候不会生成table的副本或创建新的table,因此不需要对其进行声明。
表示: 操作table中元素的方法有a["x"]和a.x两种方法;区别:a["x"]表示采用字符串“x”来索引table;a.x表示采用变量x来索引table
a={}
k="X"
a[k]=10;
a[20]="great"
print(a[k]) --10
print(a["X"]) -- 10
k=20;
print(a[k]) --greate
a["X"]=a["X"]+1; -- 21
print(a["X"])
print(a.X) --a.X表示的是以字符串“X”索引table, a[k]是表示用变量k的值来索引table
print(a.k) --因为字符串“K”是未定义的值,因此是输出的nil
#: 返回一个线性数组或table中的最后一个元素的索引值,可以理解为获取的是其的长度: print(a[#a])打印a中的最后一个元素的值
算术操作符:左值=右值(左值:用于表示变量在内存存储中的地址; 右值:表示该地址内存中的存储的值) 。
关系操作符:关系操作符返回的结果都是true或false; 在处理table、函数、userdata,lua采用的是引用的比较方式(即:只有当它们引用同一个对象时,才认为相等)。
逻辑操作符:and、or或not 。
and:第一个操作数为false,则返回第一个操作数;否则返回第二个操作数;
or: 第一个操作数为true,则返回第一个操作数;否则返回第二个操作数;
注释:从上面and和or的判断条件都是按照第一个操作数,因此我们称这种为“短路求值”,表示只有需要时才会去评估第二个操作数。 例如:“x=x or v” 表示: if not x then x = v end
1.Lua中的函数属于第一类值(可以理解为是一种特殊的变量); 函数实际上是在讨论一个持有该函数的变量;
2.匿名函数:可以将function(x) --body end 视为一种函数的构造表达式(如table的构造是{}一样),然后将函数的构造式的结果称为“匿名函数”。
function derivative(f, delta)
delta = delta or 1e-4
return function (x) --function(x)是匿名函数
return (f(x + delta) - f(x))/delta
end
end
c = derivative(math.sin) --derivative是高阶函数(将函数作为其实参的传入值)
print(c(10))
function newCounter()
local i = 0 --i 是非局部变量
return function () --返回closure
i = i+1
return i
end
end
参见博客可以帮助理解:
http://blog.csdn.net/lidatou/article/details/3866399
local fact = function(n)
if n==1 then
return 1
else
return fact(n-1) --error:调用fact(n-1)时,局部的fact(n-1)尚未定义完毕,因此这里调用的是一个全局的fact(因此会报fact为nil的错误)
end
解决:
local fact
fact = function(n) --这种其实是局部函数local function fact(n) 展开的‘语法糖’;特别注意在间接调用(如间接递归)的时候,要使用前置声明
if n==1 then
return 1
else
return fact(n-1) --此时调用的fact是局部变量,虽然在函数定义时,这个局部变量的值尚未完成定义,但在函数执行后,fact肯定有了正确的值
end
5.尾调用