Lua学习笔记

来源:互联网 发布:什么软件外卖货到付款 编辑:程序博客网 时间:2024/06/05 23:47

PuzzledBoy这几天在看Unity3D,觉得U3D确实是一个很强大的引擎啊。不过也很庆幸自己先学了cocos2dx,U3D虽然很强大但是一开始就学确实不好懂,看起来操作很简单但是你会一头雾水。相反cocos2dx的开源性质能让你学到很多的东西,日后再学U3D倒是简单了很多。“学习从coco2dx开始,再转到U3D。”这也是一个大神给我的建议,目前看来似乎挺对的(乃每次开场都要讲废话吗!!!)。


---------------------------------------------------------------------------------------------无视上面的分隔线------------------------------------------------------------------------------------------------------------

哎下面进入严肃的正题吧:

早上翻了翻自己以前自学Lua的学习笔记,觉得有必要复习一次,想了想干脆新开一篇文章顺便也分享一下吧。

不知道大家有没有这样一种感觉,自己学一样新事物的时候,总会遇到一些很难绕过去的但很简单的知识点,但是查找相关资料和问人的时候总是找不到满意的解释。

我的学习笔记里面就记录着那些类似的知识点(至少我觉得是)、初学Lua容易混淆的知识点以及一些Lua的Tips用法。


局部变量

Lua中的局部变量和其他语言的不同,只有形参和local修饰的变量才是局部变量,其他的默认都是全局变量。


and和or 逻辑运算符

Lua中的and和or很特别,它们都使用短路原则,它们只会在需要的时候才去评估第二个操作数。

例如 :

表达式 a and b, 当a为假的时候表达式返回a,否则就返回b。

对于表达式 c or d,当c为真的时候就返回c,否则返回d。

初学者千万不要将对其他语言的and和or的理解用在Lua上,Lua的 and 和or 是很特别的,而且配合Lua的其他性质能发挥出一些很厉害的功能;

and的优先级高于or。


多重赋值、变量交换

对 a,b = 10,2*x 这样的表达式,Lua先对等号右边的所有元素求值,然后才执行赋值。

这样便可以用多重赋值的特性来交换两个变量:

x,y = y,x 

table

Lua中table的索引值从1开始而不是0;

table的构造式中可以用分号代替逗号,通常会将分号用于分隔构造式中的不同成分;


稀疏矩阵

Lua稀疏矩阵不需要压缩,因为没有值的地方都是nil(好方便啊!!!);

不能对稀疏矩阵执行取长度操作,因为在有效条目之间存在“空洞(nil) 值”,所以一般用pairs且只遍历那些非nil的元素:

for i,v in pairs(table) do--your codeend
* 注意:table中的key是无序的,使用pairs的迭代不保证会按递增次序来访问元素。


理解闭合函数

Lua闭合函数这个东西,是什么和怎么用我这里就不写了,百度和Lua的书籍上资料太多。

但我相信肯定有人抱有闭合函数“为什么会这么神奇?”,"怎么做到的?"之类的疑问(我当时就有)。

下面是我自己的理解(有错误请指正):


首先,我们要明确一个概念,即在Lua中,一切都是变量。

包括函数,函数也是一个变量,在Lua中,我们可以把函数赋值给一个变量:

function name(your pars) -- your codeendfun = name

当我们调用一个函数时,我们可以理解为“实例化了一个函数”,生成了一个函数对象,并且这个函数对象捕获了其外部的变量(我发现很难讲清楚)。

闭合函数的特点,我觉得和“仿函数”有点类似,“仿函数”是一个重载了()运算符的类:

class funcpublic:type operator( your pars ) {  -- your code }};

我们还可以往类中加几个参数,类似“捕获列表”,稍微改写一下上面的类:

class funcpublic: int x,y; int operator() {  return x+y; }};
当我们要使用“仿函数”的时候,其实就是实例化了上面的类:

func f;f.x = a ; f.y=b;   //相当于捕获了 a和b 这两个变量的值。f() ; //表达式的结果就是a+b。

有没有发现“仿函数”和“闭合函数”有某些地方很类似呢?

所以可以理解“闭合函数”就是一个自动捕获了其外部作用域中所有变量的“仿函数“。

如果你懂了“仿函数”的话,我相信你一定理解了Lua中的闭合函数。



LUA 与 C 的通信

lua_to*

lua_to* (表示lua+to 开头的一类函数),是不会从通信栈中弹出该元素的!

如果指定元素不具有正确的类型,lua_to* 也不会报错,这种情况下:

lua_toboolean、 lua_tonumber、lua_tointerger和 lua_objlen 会返回0,而其他函数返回NULL。


lua_pcall

在向通信栈中压入结果前,lua_pcall会先删除栈中的函数和参数;

如果lua_pcall的运行过程中有任何错误,lua_pcall会返回一个非零值,并在栈中压入一个错误处理函数,不过它仍会弹出函数和其参数。




”不知不觉过了几个小时啊!!! 我还要打机呢!!!暂时这么多吧。“

”......“

“~~~有空会补充的~~~。”

”......“

”......“

”......“


这是PuzzledBoy的第三篇博客,谢谢你的阅读和关注~~~

0 0
原创粉丝点击