第一章 Lua教程
1.
- 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- Lua 应用场景
- 游戏开发
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- Linux 系统上安装
1.
Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:
2.
我们也可以将代码修改为如下形式来执行脚本(在开头添加:#!/usr/local/bin/lua):
注释
--
标示符
Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言
关键词
一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。
全局变量
如果你想删除一个全局变量,只需要将变量赋值为nil。
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。
nil 类型表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值:
":
3.
Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)
string(字符串)
也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。
html = [[ <html> <head></head> <body> <a href="http://www.runoob.com/">菜鸟教程</a> </body> </html> ]] print(html)
使用 # 来计算字符串的长度,放在字符串前面,如下实例:
table(表)
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。
7.
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
a, b = 10, 2*x <--> a=10; b=2*x
3.
Lua 语言提供了以下几种循环处理方式:
循环控制语句控制语句描述break 语句退出当前循环或语句,并开始脚本执行紧接着的语句。
第七章 流程控制
1.
函数定义
解析:
optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
-
function_body: 函数体,函数中需要执行的代码语句块。
- myprint = function(param) print("这是打印函数 - ##",param,"##") end function add(num1,num2,functionPrint) result = num1 + num2 -- 调用传递的函数参数 functionPrint(result) end myprint(10) -- myprint 函数作为参数传递 add(2,5,myprint)
3.
多返回值
Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)。
4.
可变参数
Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 select("#",...) 来获取可变参数的数量
-
- select('#', …)
-
返回可变参数的长度
- select(n, …) 用于访问 n 到 select('#',…) 的参数
调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参,否则只能为字符串"#",这样select会返回变长参数的总数。
运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。Lua提供了以下几种运算符类型:
- 算术运算符
- 其他运算符
2.
操作符描述实例+加法A + B 输出结果 30-减法A - B 输出结果 -10*乘法A * B 输出结果 200/除法B / A w输出结果 2%取余B % A 输出结果 0^乘幂A^2 输出结果 100-负号-A 输出结果v -10
3.
操作符描述实例==等于,检测两个值是否相等,相等返回 true,否则返回 false(A == B) 为 false。~=不等于,检测两个值是否相等,相等返回 false,否则返回 true(A ~= B) 为 true。>大于,如果左边的值大于右边的值,返回 true,否则返回 false(A > B) 为 false。<小于,如果左边的值大于右边的值,返回 false,否则返回 true(A < B) 为 true。>=大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false(A >= B) 返回 false。<=小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false(A <= B) 返回 true。
4.
操作符描述实例and逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。(A and B) 为 false。or逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。(A or B) 为 true。not逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。not(A and B) 为 true。5.
操作符描述实例..连接两个字符串a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。#一元运算符,返回字符串或表的长度。#"Hello" 返回 5
6.
^ not - (unary) * / + - .. < > <= >= ~= == and or
Lua 语言中字符串可以使用以下三种方式来表示:
- 单引号间的一串字符。
- 字符串操作
序号string.upper(argument):
字符串全部转为大写字母。3> string.gsub("aaaa","a","z",3); zzza 3string.reverse(arg)
字符串反转
6> string.format("the value is:%d",4) the value is:4 string.len(arg)
计算字符串长度。
9> string.rep("abcd",2) abcdabcd string.gmatch(str, pattern)
回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。
12> = string.match("I have 2 questions for you.", "%d+ %a+") 2 questions > = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)")) 2, "questions"
泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。
上面代码中,k, v为变量列表;pairs(t)为表达式列表。
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
多状态的迭代器
pairs 和 ipairs区别
- pairs 和 ipairs异同
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。