2. programming in Lua 3rd学习笔记
梦幻DUO
游戏开发爱好者
展开
-
Lua 语句
Lua的语句支持赋值、控制结构、程序调用、多重赋值和局部变量声明。一. 赋值 跟C语言等编程语言一样的语法,不再多说。二. 多重赋值 下面这段代码分别给a赋值10,给b赋值20a, b = 10, 20 因为多重赋值是先取值后赋值,通过多重赋值可以方便地实现交换值:x, y = y, x当要赋的值的个数比变量多,那么后面多余的会省略。 当要赋的值的个数比变量少,那么缺乏的将会由nil。还有一个原创 2016-01-18 13:32:30 · 755 阅读 · 0 评论 -
Lua chunk(程序块)
Lua里面一条语句或一块语句称之为chunk(程序块)。 Lua无需;语句结束符,但是你可以加上去。多条语句可以写在同一行而不加;,但是加上;会更清晰。示例:a = 1b = a*2a = 1;b = a*2;a = 1; b = a*2a = 1 b = a*2 -- ugly, but valid原创 2016-01-12 14:53:33 · 1664 阅读 · 0 评论 -
Lua 命名规范
Lua和C一样,支持字符、下划线和数字(数字不能在开头)。 除此之外,lua有些特殊的要求,如:下划线后面不能接一个或多个大写单词,这是lua有特殊用途的。 下面这些是lua保留的关键字,也不能使用: and break do else elseif end false goto for function if in local nil not or repeat retu原创 2016-01-12 15:09:53 · 3023 阅读 · 0 评论 -
Lua 全局变量
Lua的变量无需先声明(定义)才能使用,如果你要使用某个变量,直接使用就可以了。 未赋值的变量的值是nil。print(b) --> nilb = 10print(b) --> 10如果你将一个变量手动赋值为nil,则会对该变量进行内存回收。b = nilprint(b) --> nil原创 2016-01-12 15:15:25 · 977 阅读 · 0 评论 -
Lua 独立解释器
在命令行运行Lua脚本的参数的格式是这样的: lua [options] [script [args]]-e 编辑(edit)参数可以直接在命令行参数输入语句:% lua -e "print(math.sin(12))" --> -0.53657291800043-i是在运行脚本后进入交互模式。-l则为在运行脚本前载入lib库:% lua -i -llib -e "x = 10"在交互模式,你可以原创 2016-01-12 15:51:46 · 2638 阅读 · 1 评论 -
Lua 类型和值
Lua是动态类型语言,它有如下的类型:nil, boolean, number, string, userdata, function, thread, 和 table。 type函数用于输出类型名:print(type("Hello world")) --> stringprint(type(10.4*3)) --> numberprint(type(print)) --> function原创 2016-01-13 19:29:27 · 703 阅读 · 0 评论 -
Lua 表达式
算术操作符 Lua中的常用算术操作符有:+、-、*、/、^、%和-(符号)。%是取余数,结果跟第二个操作数符号一致。关系操作符 Lua中的关系操作符有:<、>、<=、>=、==和~=(不等符号) 次序比较操作符(<、>、<=、>=)只能用于数字和字符串。为了避免数字和字符串次序比较混淆,这已经提升到错误层次。 而表的比较,只能是指向同一个表的才是相等的。逻辑操作符 lua的逻辑操作符有an原创 2016-01-13 21:32:58 · 699 阅读 · 0 评论 -
Lua 迭代器和一般for
迭代器通过closure函数,可以创建一个持有非local变量(相当于C++的static)的函数,所以可用该函数来持有一个迭代器,每当调用该函数时返回下一个迭代值。示例:function values (t) local i = 0 return function () i = i + 1; return t[i] endendt = {10, 20, 30}iter = va原创 2016-08-02 18:28:41 · 599 阅读 · 0 评论 -
Lua 在Lua中调用C函数
首先能够被Lua调用的C函数要满足如下声明://ctypedef int (*lua_CFunction) (lua_State *L);例如: 由于Lua有局部栈,所以参数在栈中的位置永远是1开始。并且函数返回后会自动清理栈。//cstatic int l_sin (lua_State *L) { double d = luaL_checknumber(L, 1); lua_原创 2016-01-28 17:11:33 · 581 阅读 · 0 评论 -
Lua 在C程序中进行Lua表操作
为了表示RGB颜色,假设在C程序中需要用三个0~255数字,在Lua由于是实数就用0~1表示。在lua中你可以用一个表来写:--luabackground = {r=0.30, g=0.10, b=0}你也就可以这样使用预定义颜色:--luaBLUE = {r=0, g=0, b=1.0}<other color definitions>background = BLUE一、获取表信息 在原创 2016-01-28 15:18:51 · 1408 阅读 · 0 评论 -
Lua 函数
Lua中的函数参数如果是string或表构造器,则圆括号可以忽略掉。print "Hello World" <--> print("Hello World")dofile 'a.lua' <--> dofile ('a.lua')print [[a multi-line <--> print([[a multi-linemessage]]原创 2016-01-20 09:52:06 · 526 阅读 · 0 评论 -
Lua 关于函数的更多内容
一、匿名函数 Lua中的函数其实都是匿名函数,我们定义函数的时候:function foo (x) return 2*x end等价于foo = function (x) return 2*x end这里foo只是保存匿名函数的变量。1.lua的函数是一种 First-Class Value 的东西, 到底是啥? 就是它们与传统类型的变值没啥区别, 可以 存到一个变量中, 可以 存到ta原创 2016-01-23 23:51:33 · 433 阅读 · 0 评论 -
Lua 迭代器
7.1 Iterators and ClosuresIn Lua, we typically represent iterators by functions: each time we call the function, it returns the “next” element from the collection.function values (t) local i =O原创 2016-01-27 10:17:41 · 388 阅读 · 0 评论 -
lua 编译、执行和错误
一、编译 1. loadfile 只编译文件,不运行。 2. dofile 编译文件并运行。function dofile (filename)local f = assert(loadfile(filename))return f()endload(5.1以上改为loadstring) 编译字符f = load("i = i + 1")i = 0f(); print(i)原创 2016-01-27 11:12:07 · 406 阅读 · 0 评论 -
Lua 简单Lua解释器源码分析
#include <stdio.h>#include <string.h>#include "lua.h"#include "lauxlib.h"#include "lualib.h"int main (void) {char buff[256];int error;lua_State *L = luaL_newstate(); /* 创建Lua环境 */luaL_openlibs原创 2016-01-27 18:47:57 · 2298 阅读 · 0 评论 -
Lua 配置文件示例
void load (lua_State *L, const char *fname, int *w, int *h) {if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0)) error(L, "cannot run config. file: %s", lua_tostring(L, -1)); lua_getglobal(L原创 2016-01-27 21:54:39 · 942 阅读 · 0 评论 -
Lua 在C程序中调用Lua函数
调用Lua函数的步骤为: 获得函数并压入栈 按顺序压入参数 调用lua_pcall,该函数的第二个参数是参数个数,第三个参数是返回个数,第四个参数是异常处理函数 示例程序://c/* call a function 'f' defined in Lua */double f (lua_State *L, double x, double y) { int isnu原创 2016-01-28 16:10:53 · 1009 阅读 · 0 评论 -
Lua 从C程序获得Lua变量值
无论你何时想要从Lua 请求一个值(比如一个全局变量的值),调用Lua,被请求的值将会被压入栈。无论你何时想要传递一个值给Lua,首先将这个值压入栈,然后调用Lua(这个值将被弹出)。 Lua 以一个严格的LIFO 规则(后进先出;也就是说,始终存取栈顶)来操作栈。当你调用Lua 时,它只会改变栈顶部分。你的C代码却有更多的自由;更明确的来讲,你可以查询栈上的任何元素,甚至是在任何一个位置插入和删原创 2016-01-27 21:12:50 · 1407 阅读 · 0 评论 -
浅谈对Lua的看法
本着Lua简单易用的想法来学Lua,没想到这Lua是一点都不简单啊! 众人流传的Lua脚本简单,也只是停留在使用Lua脚本的层面上而已。事实上设计Lua脚本却并非易事,Lua语言设计的原则是小巧,所以甚至很多东西都没有语言层次上的实现,例如数组、类、迭代器这些在大多数语言中很常见的东西,在Lua中都需要通过表和函数的灵活变化组成。当然也提供了很多其它有趣的特性,例如闭包、协程、First-Clas原创 2016-08-12 10:06:54 · 3460 阅读 · 0 评论