1. print("hello lua")

lua官网

在线运行代码

数据类型

数据类型 描述
number 数字,可当作double,5/2 == 2.5
string 字符串
nil 空值,变量未赋值前都是nil,给变量赋值nil相当于释放变量
boolean 布尔值,true和false
table hash表,可以当成数组用,key和val可以是任何数据类型
function 函数,数据类型一种,可以赋值给变量或作为参数
userdata 自定义数据,用于扩展,可以理解成void *,无法直接修改

字符串定义

三种字符串定义方式

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

关键字

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

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

注释

  1. -- 单行注释
  2. --[[
  3. 多行注释,-和[之前不能有空格
  4. ]]

数字运算

  • + - * / 基本的加减乘除,注意5/2 == 2.5
  • % 取余,a%b = a−b∗⌊a/b⌋" role="presentation" style="position: relative;">a−b∗⌊a/b⌋a−b∗⌊a/b⌋,可用于浮点数1%-1.5 == -0.5
  • ^ 幂乘,a^i = ai" role="presentation" style="position: relative;">aiai

字符串运算

  • .. 字符串连接符,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关键字,支持块作用域,支持一次声明多个。

  1. local a,b = 1,2
  2. if a then
  3. local a,b = 10,20
  4. print(a,b) -- 输出10 20
  5. end
  6. print(a,b) -- 输出1 2

赋值语句

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

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

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

条件语句

三个基本结构。

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

for循环

例子:

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

输出 1,2,3

可以指定步长

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

输出 1,3

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

while循环

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

  1. local i = 1
  2. while i <= 3 do
  3. print(i)
  4. i = i+1
  5. end

repeat循环(不常用)

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

  1. local i = 1
  2. repeat
  3. print(i)
  4. i = i + 1
  5. until i > 3

break语句

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

注意:

  • break需要是代码块的最后一个语句。
  • 没有continue语句
  1. while true do
  2. break --错误,后面还有代码
  3. local i
  4. end
  5. while true do
  6. do break end -- 正确.do XXX end 是一个的代码块,break 确实放在了这段代码的最后面
  7. local i
  8. end

table

table就是个hash表,key(索引)是nil以外的任何值,value(值)可以是任何值。

  1. t = {1,2} -- 省略索引,索引从数字1开始,相当于 t = {}; t[1] = 1; t[2] = 2;
  2. t = {x = 10, y = 20} -- 字符常量索引,相当于 t = {["x"] = 10, ["y"] = 20}
  3. -- 混合索引,这时最好不要省略索引,数字索引可能混乱
  4. t = {
  5. 1, -- t[1] == 1
  6. x = 10, -- t.x == 10
  7. ["y"] = 20, -- t.y == 20
  8. [2] = 2, -- t[2] == 2 最后的这个,可以删掉
  9. }
  10. -- 多维数组
  11. t = {
  12. hp = 10,
  13. pos = {100,200},
  14. }

注意:

  • table的key(索引)可以是除nil以外的任何值,t[nil] = 1报错
  • table的value(值)可以是任何值,特别的:t[1] = nil的效果是删除t[1]的值
  • t["x"]可以简写成t.x,x不能是关键字,t.end = 1报错
  • table可以当成数组使用,数字索引从1开始
  • **不要数组和hash混用*

table的简单使用

1. 获取table数组的长度。

lua提供了#运算符,注意:如果table的key不是1..n,结果可能出错,因为这个返回的是一个n,满足t[n] ~= nil and t[n+1] == nil

  1. t = {nil,nil,1}
  2. print(#t) -- 3
  3. t[3] = nil
  4. print(#t) -- 0

所以:table当成数组用时,最好紧凑数组,索引是1..n,且中间没有值为nil。

2. 三种方式遍历table。

  1. t = {1,2,3}
  2. for i = 1,#t do
  3. print(i .. " : " .. t[i]) -- 1:1 2:2 3:3
  4. end
  5. for i,v in ipairs(t) do
  6. print(i .. " : " .. v) -- 和上面一样的功能
  7. end
  8. for i,v in pairs(t) do
  9. print(i .. " : ".. v) -- 遍历table所有元素,如果table是紧凑的数组,则和上面一样。
  10. end

这儿的for in是另外for循环。

3. 常用的table数组插入删除

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

4. 排序

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

函数

两种函数声明形式

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

都是声明一个名字叫func,参数是a,b的函数。

参数不需要说明类型,返回值不需要说明。

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

函数参数可以接受任意多个,使用...来接受

  1. function generate()
  2. return 1,2,3
  3. end
  4. function MyPrint(...)
  5. print("my print:",...)
  6. end
  7. MyPrint(generate()) -- my print: 1 2 3

lua入门的更多相关文章

  1. lua入门demo(HelloWorld+redis读取)

    1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ...

  2. Openresty最佳案例 | 第2篇:Lua入门

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616622 本文出自方志朋的博客 什么是lua Lua 是一种轻量小巧的脚本语言,用标准 ...

  3. Lua入门记录

    学习资料 Lua入门和Lua高阶章节 Lua中文文档 阅读笔记,只是记录了知识点和一些注意点,详细的看上面提供的学习资料链接 Lua 基础数据类型 nil(空) boolean(布尔) Lua 中 n ...

  4. [置顶] 轻量级语言Lua入门

    作为一个脚本爱好者,而且是脚本(Perl)起家的我,一有空就喜欢学习下这些脚本语言.据说魔兽世界.愤怒小鸟都用到了它,所以今天研究下Lua这个叫法有点奇特的脚本 [转载请注明出处:http://blo ...

  5. OpenResty(nginx+lua) 入门

    OpenResty 官网:http://openresty.org/ OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台.最重要的一点是它将lua/luajit打包了进来, ...

  6. lua 入门学习

    -- 1.Hello world print( "--------------1--------------") print("Hello world"); - ...

  7. [Lua]入门教程

    什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  8. Lua入门基础

    什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  9. [Lua]Lua入门教程

    什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

随机推荐

  1. FFMPEG 库移植到 VC 需要的步骤

    在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷贝到工程中就行了,还需要做以下几步.(此方法适用于自己使用MinGW编译的库,也同样适用于从网上下载的编译好的库,例如http: ...

  2. Mybatis学习——一对一关联表查询

    1.SQL语句建表 CREATE TABLE teacher( t_id ) ); CREATE TABLE class( c_id ), teacher_id INT ); ALTER TABLE ...

  3. Android SDK Manager 更新代理配置 ,蛋碎了

    启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 在『Andro ...

  4. BasicDataSource配备

    BasicDataSource配置 commons DBCP 配置参数简要说明 前段时间因为项目原因,要在修改数据库连接池到DBCP上,折腾了半天,有一点收获,不敢藏私,特在这里与朋友们共享. 在配置 ...

  5. [Papers]NSE, $u_3$, Lebesgue space [Cao-Titi, IUMJ, 2008]

    $$\bex u_3\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{2}{3}+\frac{2}{3q},\quad \fra ...

  6. Metaspace 之二--Java 8的元空间(metaspace)、metaspace监控方法

    很多开发者都在其系统中见过“java.lang.OutOfMemoryError: PermGen space”这一问题.这往往是由类加载器相关的内存泄漏以及新类加载器的创建导致的,通常出现于代码热部 ...

  7. UiThread DEMO

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import android.a ...

  8. Mahout踩坑之路

    一.版本对比 公司版Mahout 由于Mahout只能允许于hadoop0.20以上版本上,而百度的hadoop是hadoop0.19的一个分支.因此百度HPC组曾经将Mahout移植到百度的hado ...

  9. Windows下Qt开发环境:OpenGL导入3DMax模型(.3DS)

    参考:http://blog.csdn.net/cq361106306/article/details/41876541 效果: 源代码: 解释: CLoad3DS.h为加载3DMax模型的头文件,C ...

  10. STM32的JTAG、SWD和串口下载的问题

    最近有一个项目用到STM32,为了使PCB布线方便一些所以改了一些引脚,占用了JTAG接口的PA15和PB3,所以要禁用一下JTAG,下载采用SWD模式.这样在实际操作中做出一些总结(方法网上都有.这 ...