Lua学习笔记(一)
注释
-- 单行注释
--[[
多行注释
]]
-- 等号数量只要两边一致即可
--[=[多行注释]=]
标识符
A-Z、a-z、下划线_开头后加上0个或多个字母、下划线、数字(0-9)
注意:最好不要使用下划线加大写字母,Lua保留字也是如此
不允许特殊字符@、$、%定义标识符
区分大小写
关键词
-- Lua的保留关键字
and break do else elseif end false for function if in local nil not or repeat return then true until while
-- 一般约定,以下划线开头连接一串大写字母的名字(如_VERSION)被保留用于Lua内部全局变量
_VERSION
全局变量
--[[
默认情况下变量认为是全局的,不需要声明,赋值后即创建了这个全局变量,访问一个没有初始化的全局变量不会出错,会返回nil
--]]
print(b) -- 返回nil
b=10
print(b) -- 返回10
-- 如果要删除一个全局变量,只需要将变量赋值为nil
b=nil
print(b) -- 返回nil
数据类型
-- Lua是动态类型语言,不需要定义,只需要赋值。值可以储存在变量中,作为参数传递或结果返回
-- 8个基本类型nil、boolean、number、string、userdata、function、thread、table
--[[
nil 只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
boolean 包含两个值:false和true
number 双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由C或Lua编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线程,用于执行协程
table Lua中的表是一个“关联数组”,数组的索引可以是数字、字符串或表类型。在Lua里,table的创建时通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表
]]
type() -- 该函数可以测试给定变量或者值得类型
nil(空)
-- nil类型表示没有任何有效值,它只有一个值nil
print(type(a)) -- 输出nil
-- 对于全局变量和table,nil有删除的作用
tab1={key1="val1",key2="val2","val3"}
for k,v in pairs(tab1) do
print(k .. " - " .. v) -- ..运算符用于连接字符串
end
tab1.key1=nil
for k,v in pairs(tab1) do
print(k .. " - " .. v)
end
boolean(布尔)
-- 只有两个可选值:false、true,Lua把false和nil看作是“假”,其他的都为真
if false or nil then
print("至少有一个是true")
else
print("false和nil都为false!")
end
-- 执行结果为false和nil都为false!
number(数字)
-- Lua默认只有一种number类型 double(双精度)类型
print(type(2)) -- 输出number
print(type(2e+1)) -- 输出number
string(字符串)
string1="this is string1"
string2="this is string2"
-- 也可以用两个方括号“[[]]”来表示“一块”字符串,输出时会将换行和制表等格式也输出
string3=[[
emmmmmmmmmm
aaaaaaaaaaa
ruaruaruaruarua!
]]
-- 对一个数字字符串进行算术操作,Lua会尝试将这个数字字符串转成一个数字
print("2"+6) -- 输出8.0
print("-2e2"*"6") -- 输出-1200.0
-- 字符串连接使用..操作符,注意操作对象如果为数字,则操作对象与操作符之间需要加空格
print("2".."b") -- 输出2b
print(233 .. 666) -- 输出233666
-- 使用#来计算字符串长度,放在字符串前面
len="www.rua.com"
print(#len) -- 输出11
print(#"helloworld") -- 输出10
table(表)
-- 创建一个空表
local tbl1={}
-- 直接初始表
local tbl2={"a","b","c","d"}
-- 创建键值对
a["key"]="value"
a[1]=22
key=10 -- 这里只是赋值,赋值后用于后面的创建键值对
a[key]=22
a[a[key]]=a[key]+11
-- 在Lua中,默认初始索引一般以1开始
local tb1={"a","b","c"}
for key,val in pairs(tb1) do
print("Key",key)
end
--[[
输出:
Key 1
Key 2
Key 3
]]
-- table的长度是动态增长的
function(函数)
-- 在Lua中,函数是被看作“第一类值(First-Class Value)”,函数可以存在变量里
function fun1(n) -- 一个递归求阶乘的函数
if n == 0 then
return 1
else
return n*fun1(n-1)
end
end
print(fun1(5)) -- 输出120
fun2=fun1
print(fun2(5)) -- 输出120
-- 也可以使用匿名函数的形式
function testFun(tab,fun)
for k,v in pairs(tab) do
print(fun(k,v))
end
end
tab={kay1="val1",key2="val2"}
testFun(tab,
function(key,val)
return key .. "=" .. val
end
)
--[[
执行结果:
key1=val1
key2=val2
]]
thread(线程)
Lua中主要的线程是协程(coroutine)
线程可以同时多个运行,协程任意时刻只能运行一个
userdata(自定义类型)
用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型,可以将任意C/C++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用