10分钟交互式入门Lua教程

Lua是一门什么语言?

小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。

特点
  • Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数。
  • Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
  • 以极小的体积和简单的语法提供全面的功能。[一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的]
  • 实现与宿主语言的简洁接口
  • 成为一个很容易嵌入其它语言中使用的语言。
特性
  • 支持面向对象编程
  • 轻量级
  • 可扩展
  • 函数式编程
  • 自动内存管理
  • 通用类型的表–table,可实现数组,哈希表,集合,对象
  • 支持闭包
  • 支持多线程
  • 支持交互式编程
  • -
用途
  • 游戏开发,多用于游戏脚本开发
  • 嵌入式开发
  • Web应用脚本
  • 扩展和数据库插件
  • 安全系统
安装

http://www.runoob.com/lua/lua-environment.html

学习资源
交互式

交互式编程
Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。
Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:

$ lua 
$ Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> 

在命令行中,输入以下
> print("Hello World!")
Hello World!


交互式学习lua入门体验

1.运行lua文件的方法:
$ lua HelloWorld.lua
自己参照着入门案例,在右边交互式终端中动手试一试!
菜鸟教程入门

基本的数据类型

-------------------------------------------------------基础语法  --------------------------------------------------------
-- 注释
-- 这就是单行注释

--[[
这就是多行注释
这就是多行注释
--]]


--删除变量
n = 10
print(n)
n = bil --删除变量
print(n)

--------------------------------------------------------数据类型--------------------------------------------------------------
--Lua是动态类型语言,变量不需要类型定义,只需要为变量赋值即可。
print("数据类型: nil")
print(type(nil))

print("\n")

print("数据类型: boolean")
print(type(true))
print(type(false))

print("\n")

print("数据类型: number")
-- Lua 默认只有一种 number 类型 -- double(双精度)类型
print(type(2.3))

print("\n")

print("数据类型: string")
--字符串由一对双引号或单引号来表示。
print(type("hello world in lua"))
--也可以用 2 个方括号 "[[]]" 来表示"一块"字符串
str = [[ 
hello
in 
world !
]]
print(str)

--计算字符串长度
print("the length of str is "..#str) --使用# 来计算长度



print("\n")

print("数据类型: table")  --important
-- 不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。
tab = {key1 ="value1",key2="value2"}

for k,v in pairs(tab) do
    print(k .. "-".. v)  -- 连接符 ..
end


print("\n")
tabt = {} --空表
tabt["key3"] = "value3"

key4 = "key4"
tabt[key4] = "vlaue4"

for k,v in pairs(tabt) do
    print(k.." = "..v)
end

-- 索引
--对 table 的索引使用方括号 []。Lua 也提供了 . 操作。
print("索引 "..tabt[key4])

print("索引 "..tabt.key3)

print("\n")

print("数据类型: function")
print(type(print))


function demo()
    return "hello"
end

print(demo())


--匿名函数

function anonymous(tab,fn)
    for k,v in pairs(tab) do
        print(fn(k,v))
    end
end

anonymous(tabt,function(k,v)
    return k .."==".. v
end)


--数组
print("\n")
arr = {1,2,3,"h"}
for i = 1,4 do
    print("数组 "..i.." =="..arr[i])
end

print("\n多维数组")
arrm = {}
arrm[1] = {1,2,3}
arrm[2] = {4,5,6}

for i= 1,2 do
    for j = 1,3 do
        print("多维数组 "..arrm[i][j]) --notice
    end
end
--------------------------------------------------------Lua 变量--------------------------------------------------------------
print("\n")
print("Lua 变量")

--[[
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显示声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。


应该尽可能的使用局部变量,有两个好处:
1. 避免命名冲突。
2. 访问局部变量的速度比全局变量更快。

--]]

a = 12
local b = 1

function area()
    b = 3
    local a = 3
    local c = 26
end

print("a is "..a)  --12
print("b is "..b)  -- 1  notice: here b is 1
print("c is "..type(c)) --nil

-- 多个变量同时赋值
-- 注意:如果要对多个变量赋值必须依次对每个变量赋值。
a,b = "hello","world"
print(a..b)



--------------------------------------------------------Lua 循环--------------------------------------------------------------
print("\n")
print("while循环")
i = 10
while(i > 0)
do
    i = i - 1
    print(i)
end

print("\n")

while (i < 7) do
    i = i + 1
    print(i)
end

print("\n")
print("for循环")
--[[
Lua 编程语言中 for语句有两大类::
数值for循环
泛型for循环
--------------
Lua 编程语言中数值for循环语法格式:
for的三个表达式在循环开始前一次性求值,以后不再进行求值。
for var=exp1,exp2,exp3 do  
    <执行体>  
end  
var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。
exp3是可选的,如果不指定,默认为1。
--]]

for i=0,10 do
    print(i)
end


function f(x)
    return x*5
end

for i=1,f(5),2 do
    print(i)
end

-- 泛型for循环
print("泛型for循环")
--泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句。
--i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。
arr = {1,23,4,55,1,3234,4}
for i,v in ipairs(arr) do
    print("泛型for循环:"..i..' '..v)

end


print("\n")
print("repeat until")

i = 10
repeat
    print(i)
    i = i -1
until(i < 0)


--------------------------------------------------------Lua 流程控制 --------------------------------------------------------
print("\n")
if(true) then   -- 注意这里是then
    print("if contro")
end

a = 100

-- if else
if(a >100) then
    print(a+100)
else
    print(a)
end

-- if elseif else

if(a<200) then
    print("a<200")
elseif(a <100) then
    print("a<100")
else 
    print(a)
end

--------------------------------------------------------Lua 函数---------------------------------------------------------------------

--Lua函数可以返回多个结果值
-- return a,b

--可变参数
--[[
Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...) 表示函数有可变的参数。
Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数。
--]]


function cot(...)
    return "参数个数是 "..#arg
end 
print(cot(1,2,3,4,5))



--------------------------------------------------------Lua 运算符---------------------------------------------------------------------

-- http://www.runoob.com/lua/lua-miscellaneous-operator.html


a = 21
b = 10
c = a + b
print("Line 1 - c 的值为 ", c )
c = a - b
print("Line 2 - c 的值为 ", c )
c = a * b
print("Line 3 - c 的值为 ", c )
c = a / b
print("Line 4 - c 的值为 ", c )
c = a % b
print("Line 5 - c 的值为 ", c )
c = a^2
print("Line 6 - c 的值为 ", c )
c = -a
print("Line 7 - c 的值为 ", c )


a = true
b = false
if(a or b) then
    print(a or b)
end



--------------------------------------------------------Lua 字符串---------------------------------------------------------------------


str = "hello in world! Lua loved!"
print(string.upper(str))
print(string.lower(str))
print(string.reverse(str))


--------------------------------------------------------Lua table---------------------------------------------------------------------
--[[
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。

--]]
print("\n")
print("Table 连接")
fruits = {1,2,3,4}
print("连接后",table.concat(fruits,'-'))


print("\n")
print("Table insert and remove")
table.insert(fruits,"hh")
print(fruits[5])

table.remove(fruits)  --返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起


print("Table 排序")
table.sort(fruits)
for k,v in pairs(fruits) do
    print(k.."--"..v)
end



--------------------------------------------------------Lua 协同程序---------------------------------------------------------------------
-- Notice::协同程序在在线ide上,使用coroutine.resume()不能打印出具体值来,所以建议在本地练习!!


print("\n------------协调程序-----------------\n")
--[[
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。
协同是非常强大的功能,但是用起来也很复杂。
线程和协同程序区别
线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。
在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。
协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。


coroutine.create()  创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用

coroutine.resume()  重启coroutine,和create配合使用

coroutine.yield()   挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用的效果

coroutine.status()  查看coroutine的状态
注:coroutine的状态有三种:dead,suspend,running,具体什么时候有这样的状态请参考下面的程序

coroutine.wrap()    创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复

coroutine.running() 返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号

--]]


--[[
协同有三个状态:挂起态(suspended)、运行态(running)、停止态(dead)。当我们创建协同程序成功时,其为挂起态,即此时协同程序并未运行。我们可用status函数检查协同的状态:
--]]

co = coroutine.create(
    function()
        print("Hello coroutine!")
end)

print(coroutine.status(co)) -- suspended

print("\n----------\n")
co = coroutine.create(function (a,b,c)
    print("co", a,b,c)
end)
print(coroutine.resume(co, 1, 2, 3))




-- 函数coroutine.resume使协同程序由挂起状态变为运行态:
coroutine.resume(co)

--本例中,协同程序打印出"hi"后,任务完成,便进入终止态:
print(coroutine.status(co))     --> dead

print("\n----------\n")
--协同真正的强大之处在于yield,可以将正在运行的代码挂起
co = coroutine.create(function ()
    for i=1,10 do
       print("co", i)
       coroutine.yield()
    end
end)

coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)

--------------------------------------------------------Lua 模块---------------------------------------------------------------------
--[[
模块类似于一个封装库
可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。

Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。
--]]



module = {}

module.constant = "Define constant"

function module.fn1()
    print("定义一个公有函数!")
end

local function fn2()
    print("私有函数")
end

return module

---加载模块
--[[

Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。例如:
require("<模块名>")
或者
require "<模块名>"
-- ]]








src="https://repl.it/EKOH/11" width="100%" height="7500">
分分钟学会lua_英文版:
src="https://repl.it/EKOH/2" width="100%" height="6500">
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、付费专栏及课程。

余额充值