lua入门教程

print("hello lua")

lua官网
在线运行代码

数据类型

数据类型 描述
number 数字,可当作double,5/2 == 2.5
integer 整数,可当作int64,有整除符号,5//2 == 2lua 5.3 版本开始支持
string 字符串
nil 空值,变量未赋值前都是nil,给变量赋值nil相当于释放变量
boolean 布尔值,true和false
table 两种形态:1. hash表 2. 数组
function 函数,数据类型一种,可以赋值给变量或作为参数
userdata 自定义数据,用于扩展,lua vm负责内存管理
还有种light userdata,可以理解成void *值类型,不需要内存管理

字符串定义

四种字符串定义方式

text1 = "最普通的字符串"
text2 = '和"一样'
text3 = [[
长字符串定义,忽略任何转义,最前面的换行,会被忽略
]]
text4 = [===[
长字符串定义,忽略任何转义,加=号为了能在字符串里写 a[b[1]],=数量不限
]===]

关键字

and break do else elseif end false for function if in
local nil not or repeat return then true until while

关键字不能用用作变量名。特别的:a.end = 1出错,但是可以用a["end"] = 1

注释

-- 单行注释
--[[
    多行注释,-和[之前不能有空格
]]

数字运算

  • + - * / 基本的加减乘除,注意5/2 == 2.5
  • % 取余,a%b = a - b * \lfloor {a/b} \rfloor,可用于浮点数1%-1.5 == -0.5
  • ^ 幂乘,a^i = a^i

字符串运算

  • .. 字符串连接符,print("hello".." ".."world")输出hello world

逻辑运算

  • == ~= 相等比较,任意类型都可以,注意2 ~= "2"
  • > < >= <= 大小比较,不能数字字符串混用,2 > "3"会报错
  • not 非运算,not not a相当于a ? true : false
  • and 与运算,a and b相当于a ? b : a,如果a为假值(nil或者false),返回a,否则返回b
  • or或运算,a or b相当于a ? a : b

注意:

  • andor的返回值不是bool类型的,而是参与运算的值的其中一个。
  • nilfalse为假值,其他都是真值。也就是说,空串""、数字0和空表{}都是真值。

变量

全局变量不需要声明,任何时候a = 10都是有效的,在a被赋值前,取a的值返回nil

局部变量声明使用local关键字,支持块作用域,支持一次声明多个。

local a,b = 1,2
if a then
    local a,b = 10,20
    print(a,b) -- 输出10   20
end
print(a,b) -- 输出1    2

补充:
局部变量性能好于全局变量,它的值在栈上,访问时用的索引。
全局变量是取的全局表。print(1)等同于_G["print"](1)
可以修改下变成

local print = print
print(1)

赋值语句

lua的=表达式比较特殊,支持一次赋值多个,多余的忽略,不够的补nil。

a, b = 1,2,3 -- 3忽略
c, d = 4 -- d是nil

交换x和y的值可以写成x,y = y,x,十分方便。

条件语句

三个基本结构。

if x then
    print("if语句,如果x为真,输出这句话")
end
if x then
    print("if + else语句")
else
    print("如果x为假,输出这句话")
end
if x then
    print("if + elseif语句")
elseif y then
    print("x为假,y为真,才输出这句话")
end

for循环

例子:

for i = 1,3 do
    print(i)
end

输出 1,2,3

可以指定步长

for i = 1,3,2 do
    print(i)
end

输出 1,3

补充:还有种for in循环在table使用小节里介绍。

while循环

条件成立继续循环,例子:

local i = 1
while i <= 3 do
    print(i)
    i = i+1
end

repeat循环(不常用)

条件成立退出循环,例子:

local i = 1
repeat
  print(i)
  i = i + 1
until i > 3

break语句

可以用break退出上述三种循环。
注意:

  • break需要是代码块的最后一个语句。
  • 没有continue语句
while true do
  break --错误,后面还有代码
  local i
end

while true do
  do break end -- 正确.do XXX end 是一个的代码块,break 确实放在了这段代码的最后面
  local i
end

table·数组

table的第一种形态:数组

1. 初始化

t = {1,2} -- 索引从数字1开始,相当于下面的例子
t = {}; 
t[1] = 1;
t[2] = 2;

2. 插入删除

t = {1,2,3}
table.insert(t,4) -- 在结尾追加4,变成{1,2,3,4}
table.remove(t)   -- 移除结尾元素,变成{1,2,3}
table.remove(t,2) -- 移除第2个元素,变成{1,3},会移动后边的元素

3. 获取长度

t = {1,2,3}
print(#t) -- 3

4. 遍历

t = {1,2,3}
for i = 1,#t do
    print(i .. " : " .. t[i]) -- 1:1 2:2 3:3
end
-- 这就是第二种for循环
for i,v in ipairs(t) do
    print(i .. " : " .. v) -- 和上面一样的功能
end

6. 排序

t = {1,3,2}
table.sort(t) -- 1,2,3
table.sort(t,function(a,b) return a > b end) -- 3,2,1

注意:

  • table当成数组使用,数字索引从1开始
  • table当成数组用时,要保证是紧凑数组,索引1..n,t[i] ~= nil -- i in [1,n],后面会说明为什么。

table·hash表

table当成hash表使用

1. 初始化


t = {["x"] = 10, ["y"] = 20}
t = {x = 10, y = 20} -- 字符常量索引,和上面一样
-- 多维数组
t = {
    hp = 10,
    pos = {100,200},
}

2. 删除


t = {x = 1, y = 2}
t["x"] = nil -- 删除key "x"

3. 遍历


t = {x = 1, y = 2}
for k,v in pairs(t) do
    print(k .. ":".. v) -- x:1  y:2
end

注意:

  • table的key(索引)可以是除nil以外的任何值,t[nil] = 1报错
  • table的value(值)可以是任何值,特别的:t['x'] = nil的效果是删除t['x']的值
  • t["x"]可以简写成t.x,x不能是关键字,t.end = 1报错

table·不要数组和hash混用

table实际也可以混合数组和hash部分,如下

t = {
    1,
    ["x"] = 2,
    y = 3,
    [4] = 4,
}

最好不要这么使用,数组和hash表是两个不同的语义结构,lua的table实现混合了他们,可以统一理解成hash表。
table使用有坑
其中最大的坑获取数组长度,lua提供了#运算符。
但是:如果table的key不是1..n,结果可能出错,因为这个返回的是一个n,满足t[n] ~= nil and t[n+1] == nil

t = {1,2}
t[3] = 1 
print(#t) -- 数组是{1,2,3} 结果是 3
t[2] = nil 
print(#t) -- 数组是{1,nil,3} 结果是1

如果是hash表,hash值作为索引,结果会更难预料。
所以说:table作为数组用,最好的紧凑数组

函数

两种函数声明形式

function func(a,b)
    -- 先定义func变量,再定义函数,可以在这儿使用func递归调用
end
func = function(a,b)
    -- 先定义了匿名函数,再赋值给变量func,这儿不能使用func递归调用
end

都是声明一个名字叫func,参数是a,b的函数。
参数不需要说明类型,返回值不需要说明。

函数可以返回任何个数的数据,使用return返回,returnbreak一样,必须在代码块的最后面。
函数参数可以接受任意多个,使用...来接受

function generate()
    return 1,2,3
end
function MyPrint(...)
    print("my print:",...)
end

MyPrint(generate()) -- my print:    1    2    3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容