lua简明教程

起因

因为项目原因,开始学习lua。

想法

刚开始我是拒绝的。要我写lua?那不是脚本语言吗?不是c#,不是面向对象语言,那我费了老多时间学的设计模式还有积累的经验不是没得用了?

然而,经过几天的学习之后,我只想说一句:“真香”。

lua是一个很灵活,很优雅的语言。

1、它是弱类型的,即变量不用声明类型,还可以赋值为任意类型(用过“大家都会”的python的人应该知道)。【灵活度+1】

2、运用了函数式编程的思想,将function(函数)作为first class(“一等公民”),属于基本数据类型,可以赋值给变量。【灵活度+2】

3、提供了“万能”的数据类型table,用起来就是key-value的哈希表。再加上1,2两条,模拟面向对象中的“类”轻而易举。【灵活度+3】

4、提供了神奇的metatable(元表)和它的_index(元方法)。可以用于实现面向对象的继承,多态,保存“类”的信息。【灵活度+1024】

工作

1、数据类型(8种)

 
-- 短注释
 --[=[ 长注释:"="用于匹配开始与结束的位置 ]=]
 ​
 print(type(nil))                --> nil
 print(type(true))               --> boolean
 print(type(3.14*2))             --> number
 print(type("Hello world"))      --> string
 print(type(type(X)))            --> string
 print(type(print))              --> function
 print(type(type))               --> function
 ​
 ​
 -- 科学记数法
 print(type(2e1))
 ​
 -- "[[]]"可表示字符串,注意里面会包含换行符
 html = [[
 <a>test</a>
 ]]
 print(html)
 ​
 -- string与number计算时,string会被转化为number
 print("1"+1)
 --print('a'+1)
 ​
 -- ".."用于连接字符串
 print("a".."b")
 ​
 --#用于获得字符串的长度
 s = "ab"
 print(#s)

结果:

 nil
 boolean
 number
 string
 string
 function
 function
 number
 <a>test</a>
 ​
 2
 ab
 2
 ​

 

PS:

nil:未赋值变量的默认值,表示无效值。在条件表示式中相当于false。赋给全局变量后,GC会回收。

boolean:false/true

number:双精度实浮点数(不像其他语言有多类型数字)。支持科学记数法:e表示10的几次方。

string:用 双引号/单引号/[[内容]] 来表示。..可连接两个字符串。#取长度。以nil结尾。

userdata:表示任意存储在变量中的C数据结构。(暂时没研究)

thread:用于协程。(暂时没研究)

 

以下重点讲function和table

function

以end为结尾。支持多返回值,可变参数。

 function factorial(n)
     if n == 0 then
         return 1
     else
         return n * factorial(n - 1)
     end
 end
 ​
 print(factorial(3))
 ​
 --将factorial函数赋值给f变量
 f = factorial
 print(f(3))
 ​
 function maximum (a)
     local mi = 1             -- 最大值索引
     local m = a[mi]          -- 最大值
     for i,val in ipairs(a) do
        if val > m then
            mi = i
            m = val
        end
     end
     return m, mi
 end
 ​
 print(maximum({8,10,23,12,5}))
 ​
 function average(...)
    result = 0
    local arg={...}    --> 局部变量arg 为一个表,,将传入的参数赋给它
    for i,v in ipairs(arg) do
       result = result + v
    end
     --[[ select函数中的第一个参数为selector,第二个参数为传入处理的变参。如果selector的值为数字n,那么select函数返回变参中的第n个参数,如果selector的值为'#',select函数会返回可变参数的数量。(等价于#arg)]]
     print("input " .. select("#",...).. " numbers")
     return result/#arg
 end
 ​
 print("average is ",average(1,2,3))

结果

 6
 6
 23      3
 input 3 numbers
 average is      2
 ​

 

table

table 使用关联型数组,可用任意类型的值作为数组的key(索引),但这个值不能是 nil。不固定大小。

table可用于表示其他语言中的类,模块。

 -- 初始化table,不初始化的变量不能当table用,会报错
 t = {}
 ​
 -- 指定值
 t[1]= "a"
 t["key"]= "val"
 ​
 print(t[1],t["key"])
 ​
 -- 调用require加载模块后,获得以模块名为名的table,即可使用
 require("<模块名>")

闭包:函数内嵌套函数。

这里的函数f2可以访问参数n,而n是外部函数f1的局部变量。在f2中,变量n即不是全局变量也不是局部变量,将其称为一个非局部变量(non-local variable)或upvalue。upvalue实际指的是变量而不是值,这些变量可以在内部函数之间共享,即upvalue提供一种闭包之间共享数据的方法。

 function f1(n)
    --函数参数n也是局部变量
    local function f2()
       print(n)   --引用外部函数的局部变量
    end
    return f2
 end
 ​
 g1 = f1(2015)
 g1() -- 打印出2015
 ​
 g2 = f1(2016)
 g2() -- 打印出2016

具体请参考:https://blog.csdn.net/MaximusZhou/article/details/44280109

2、语法

 
while(condition) do
    statements
 end
 ​
 repeat
    statements
 until( condition )
 ​
 for init,max/min value, increment
 do
    for init,max/min value, increment
    do
       statements
    end
    statements
 end
 ​
 -- var以exp3为步长(不指定的话默认为1),从exp1变化到exp2。若exp为表达式或函数,则仅会在开始前一次性求值。
 for var=exp1,exp2,exp3 do  
     <执行体>  
 end  
 ​
 -- 泛型 for 循环。通过一个迭代器函数来遍历所有值,即其他语言中的foreach 语句。这里ipairs是Lua提供的一个迭代器函数,用来迭代数组。
 a = {"one", "two", "three"}
 for i, v in ipairs(a) do
     print(i, v)
 end 

 

3、metatable(元表)和元方法

通过setmetatable(table,metatable):对指定 table 设置元表,如果元表(metatable)中存在 __metatable 键值(保护元表,不可读写),setmetatable 会失败。

getmetatable(table):返回对象的元表(metatable)。

 

元方法:metatable的默认键值。定义了table的原始的某些特定行为(例如加减乘除,大小等于(c++的重载运算符的既视感),基类)。用“ _ ”开头。

 

_index元方法

最常用的键值,用于实现继承其他table。当访问table的没有值的key时,lua会去查找该table的metatable中的 _index(也是一个table)对应key的值,再没有就继续递归查找 _index的 metatable中的 _index,直到最后nil。

 
mt = {a = 1}
 t = setmetatable({},{_index = mt})
 print(t.a)

 

参考:

http://www.runoob.com/lua/lua-data-types.html

https://blog.csdn.net/MaximusZhou/article/details/44280109

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lua中文教程,原名:programming in lua 目录 版权声明..............i 译序..i 目录iii 第一篇语言.......1 第0章序言.......1 0.1 序言..........1 0.2 Lua的使用者................2 0.3 Lua的相关资源............3 0.4 本书的体例.................3 0.5 关于本书...3 0.6 感谢..........4 第1章起点.......5 1.1 Chunks.......5 1.2 全局变量...7 1.3 词法约定...7 1.4 命令行方式.................7 第2章类型和值9 2.1 Nil..............9 2.2 Booleans....9 2.3 Numbers...10 2.4 Strings......10 2.5 Functions.12 2.6 Userdata and Threads.12 第3章表达式..13 3.1 算术运算符...............13 3.2 关系运算符...............13 3.3 逻辑运算符...............13 3.4 连接运算符...............14 3.5 优先级.....15 3.6表的构造..15 第4章基本语法................18 4.1 赋值语句.18 4.2 局部变量与代码块(block)......19 4.3 控制结构语句...........20 Programming in Lua iv Copyright ® 2005, Translation Team, www.luachina.net 4.4 break和return语句......23 第5章函数......24 5.1 返回多个结果值.......25 5.2可变参数..27 5.3 命名参数.28 第6章再论函数................30 6.1 闭包........32 6.2 非全局函数...............34 6.3 正确的尾调用(Proper Tail Calls)...36 第7章迭代器与泛型for....40 7.1 迭代器与闭包...........40 7.2 范性for的语义...........42 7.3 无状态的迭代器.......43 7.4 多状态的迭代器.......44 7.5 真正的迭代器...........45 第8章编译·运行·调试47 8.1 require函数.................49 8.2 C Packages.................50 8.3 错误........51 8.4 异常和错误处理.......52 8.5 错误信息和回跟踪(Tracebacks)....53 第9章协同程序................56 9.1 协同的基础...............56 9.2 管道和过滤器...........58 9.3 用作迭代器的协同...61 9.4 非抢占式多线程.......63 第10章完整示例..............68 10.1 Lua作为数据描述语言使用........68 10.2 马尔可夫链算法.....71 第二篇 tables与objects........75 第11章数据结构..............76 11.1 数组......76 11.2 阵和多维数组.........77 11.3 链表......78 11.4 队列和双端队列.....78 11.5 集合和包.................80 11.6 字符串缓冲.............80 第12章数据文件与持久化..................84 12.1 序列化...86 Programming in Lua v Copyright ® 2005, Translation Team, www.luachina.net 第13章 Metatables and Metamethods...92 13.1 算术运算的Metamethods............92 13.2 关系运算的Metamethods............95 13.3 库定义的Metamethods................96 13.4 表相关的Metamethods................97 第14章环境..103 14.1 使用动态名字访问全局变量...103 14.2声明全局变量........104 14.3 非全局的环境.......106 第15章 Packages.............109 15.1 基本方法...............109 15.2 私有成员(Privacy)................111 15.3 包与文件................112 15.4 使用全局表............113 15.5 其他一些技巧(Other Facilities)...115 第16章面向对象程序设计.................118 16.1 类.........119 16.2 继承.....121 16.3 多重继承...............122 16.4 私有性(privacy)...................125 16.5 Single-Method的对象实现方法127 第17章 Weak表...............128 17.1 记忆函数...............130 17.2 关联对象属性.......131 17.3 重述带有默认值的表...............132 第三篇标准库134 第18章数学库................135 第19章 Table库...............136 19.1数组大小................136 19.2 插入/删除..............137 19.3 排序.....137 第20章 String库..............140 20.1 模式匹配函数.......141 20.2 模式.....143 20.3 捕获(Captures).146 20.4 转换的技巧(Tricks of the Trade)151 第21章 IO库..157 21.1 简单I/O模式..........157 21.2 完全I/O 模式........160 Programming in Lua vi Copyright ® 2005, Translation Team, www.luachina.net 第22章操作系统库........165 22.1 Date和Time............165 22.2 其它的系统调用...167 第23章 Debug库..............169 23.1 自省(Introspective)..............169 23.2 Hooks...173 23.3 Profiles.174 第四篇 C API..177 第24章 C API纵览..........178 24.1 第一个示例程序...179 24.2 堆栈.....181 24.3 C API的错误处理..186 第25章扩展你的程序....188 25.1 表操作.189 25.2 调用Lua函数.........193 25.3 通用的函数调用...195 第26章调用C函数..........198 26.1 C 函数..198 26.2 C 函数库................200 第27章撰写C函数的技巧..................203 27.1 数组操作...............203 27.2 字符串处理...........204 27.3 在C函数中保存状态.................207 第28章 User-Defined Types in C........212 28.1 Userdata.................212 28.2 Metatables..............215 28.3 访问面向对象的数据...............217 28.4 访问数组...............219 28.5 Light Userdata........220 第29章资源管理............222 29.1 目录迭代器...........222 29.2 XML解析...............225
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值