Lua学习笔记
见http://www.runoob.com/lua/lua-tutorial.html
注释
– 表示单行注释
–[[
多行注释
–]]
标识符
同C,不能以数字开头,区分大小写,最好不要使用下划线加大写字母的标识符
全局变量
如果不存在,则输出nil,如果想删除一个全局变量,只用使用nil将其赋值(默认情况下变量总是全局变量),nil表示变量不存在
Lua数据类型
nil 表示一个无效值,在条件表达式中相当于false
boolean 包含两个值 false和true
number 表示双精度的实浮点数
string 由双引号或单引号表示;用两个方括号表示一块字符串,如:[[jskdjskdjkscnjadjakdjakd]]
function 由C或Lua编写的函数
userdata 表示任一存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table 关联数组,索引可以是数字或者字符串(相当于map)
关于下面的匿名函数有一点不太理解。。。以后见到在回来看
其中的..”=”..表示的是什么:表示的是字符串连接
还有pairs表示什么
-- function_test2.lua 脚本文件
function anonymous(tab, fun)
for k, v in pairs(tab) do
print(fun(k, v))
end
end
tab = { key1 = "val1", key2 = "val2" }
anonymous(tab, function(key, val)
return key .. " = " .. val
end)
线程跟协程的区别
线程可以同时运行多个,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起时才会暂停
变量
Lua变量的类型:全局变量,局部变量,表中的域
一般为全局变量,只有用local声明的变量才为局部变量,该作用域是从声明的位置开始到所在语句块结束
变量的默认值是nil
对多个变量赋值:a,b=10,2*x 会先执行右边的语句,然后进行赋值语句
当变量个数和值的个数不一致时,Lua会采取如下:变量个数>值的个数 按变量的个数补足nil;变量个数<值的个数 多余的值会被忽略
a,b=f() f()返回两个值,第一个赋值给a,第二个赋值给b
应该尽可能的使用局部变量,有两个好处: 避免命名冲突,访问局部变量的速度比全局变量的速度快
对索引的操作: 可以使用t[i]或t.i
循环
举个例子:
while(true)
do
print("循环一直进行下去")
end
判断语句中,Lua认为false和nil为假,true和非nil为真;因此0别认为是true
if(0)
then
print("0为 true)
end
>>0为 true
函数定义
Lua 编程语言函数定义格式如下:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
-
解析:
optional_function_scope
-
该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
function_name:
指定函数名称。
argument1, argument2, argument3…, argumentn:
函数参数,多个参数以逗号隔开,函数也可以不带参数。
function_body:
函数体,函数中需要执行的代码语句块。
result_params_comma_separated:
函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
可变参数:使用…
function average(...)
result=0
local arg={...}
for i,v in ipairs(arg) do
result=result+v
end
print("sum"..#arg)
return result/#arg
end
print("average",average(10,5,3,4,5,6))
--这个里面的ipairs不太理解
关系运算符
== 等于
~= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
逻辑运算符
and 逻辑与
or 逻辑或
not 逻辑非
其他
.. 表示字符串连接
# 返回字符串或表的长度
字符串操作
大小写转换
string1=”Lua”
print(string.upper(string1))
print(string.lower(string1))
字符串查找 string.find(“Lua Tutorial”,”Tutor”) 返回的是下标
反转 string.reverse(“Lua Tutorial”) 返回反转的字符串
字符串格式化
date = 2; month = 1; year = 2014
print(string.format(“日期格式化 %02d/%02d/%05d”, date, month, year))
输出:日期格式化 02/01/02014
数组
一位数组
array={"Lua","Tutorial"}
for i=0,2 do
print(array[i])
end
以上代码输出的是:
nil
Lua
Tutorial
表示的是默认数组的下标是从1开始的,因此0返回的是nil
可以指定为负数,如下面的代码
array = {}
for i= -2, 2 do
array[i] = i *2
end
for i = -2,2 do
print(array[i])
end
迭代器(iterator)
关于paris和ipairs的区别,详见http://www.runoob.com/lua/lua-iterators.html
ipairs仅仅只能遍历值,按照索引升序遍历,索引中断停止遍历,即不能返回nil
table的使用
table.concat()
fruits = {“banana”,”orange”,”apple”}
print(“连接后的字符串 “,table.concat(fruits)) bananaorangeapple
print(“连接后的字符串 “,table.concat(fruits,”, “)) banana, orange, apple
print(“连接后的字符串 “,table.concat(fruits,”, “, 2,3)) orange, apple
table.insert()
fruits = {“banana”,”orange”,”apple”}
table.insert(fruits,”mango”)
print(“索引为 4 的元素为 “,fruits[4]) 索引为 4 的元素为 mango
table.insert(fruits,2,”grapes”)
print(“索引为 2 的元素为 “,fruits[2]) 索引为 2 的元素为 grapes
print(“最后一个元素为 “,fruits[5]) 最后一个元素为 mango
table.remove(fruits)
print(“移除后最后一个元素为 “,fruits[5]) 移除后最后一个元素为 nil
table.sort() 排序
require 函数