Lua学习笔记
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 code end* 注意:table中的key是无序的,使用pairs的迭代不保证会按递增次序来访问元素。 理解闭合函数 Lua闭合函数这个东西,是什么和怎么用我这里就不写了,百度和Lua的书籍上资料太多。 但我相信肯定有人抱有闭合函数“为什么会这么神奇?”,"怎么做到的?"之类的疑问(我当时就有)。 下面是我自己的理解(有错误请指正): 首先,我们要明确一个概念,即在Lua中,一切都是变量。 包括函数,函数也是一个变量,在Lua中,我们可以把函数赋值给一个变量: function name(your pars) -- your code end fun = name 当我们调用一个函数时,我们可以理解为“实例化了一个函数”,生成了一个函数对象,并且这个函数对象捕获了其外部的变量(我发现很难讲清楚)。 闭合函数的特点,我觉得和“仿函数”有点类似,“仿函数”是一个重载了()运算符的类: class func public: type operator( your pars ) { -- your code } }; 我们还可以往类中加几个参数,类似“捕获列表”,稍微改写一下上面的类: class func public: 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的第三篇博客,谢谢你的阅读和关注~~~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |