Lua学习笔记(二):基本语法
Lua学习指南:http://www.lua.org/manual/
首先我们要明确的一点是:在Lua中,除了关键字外一切都是变量。
Lua关键字
可以查看这个地址:http://www.lua.org/manual/5.1/manual.html#2.1
关于分号
语句的最后可以用分号";"表示结束,也可以不写。
而对于一行有多个语句的情况下,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,建议总是用分号隔开。
使用注释
单行注释使用“--”即可,以后的内容都会被当做注释;
多行注释以“--[[”开始,以“]]”结束。
变量
声明
由于是动态类型,所以变量声明时不需要声明类型,但是一定要进行赋值,如果希望是空类型,可以赋值nil,如下:
num = --数字100
str = "abc"--字符串abc
obj = nil--空类型
注意在Lua中所有的变量和关键字都是大小写敏感的。
赋值
可以一次对多个变量赋值,规则:如果等号(“=”)右边多了,则舍弃,左边多了,则赋值为空(nil) 。
表达式 a,b=b,a表示a和b的值交换,类型不一样照样可以交换。
a, b, c = , "abc"
print(a, b, c)--100 abc nil a, b = b, a
print(a, b, c)--abc 100 nil
类型
我们看看Lua内置的基本数据类型都有哪些:
- nil:表示变量还没有被赋值,可以看做删除该变量的意思;
- Boolean:布尔类型,true和false;
- number:数字类型,内部以double表示;
- string:字符串,总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串,而是其超集;
- table:表,实际是一个关联数组,索引可以使用数字或字符串,不同于其他语言的数组把0作为数组的初始索引,在Lua里表的默认初始索引一般以1开始。table的变量只是一个地址引用,对table的操作不会产生table的副本或创建新的table,table不会固定长度大小,有新数据添加时table长度会自动增长,没初始的table都是nil;
- function:函数,可以作为匿名函数来使用;
- userdata:用户(非脚本用户)定义的C数据结构,脚本用户只能使用它,不能定义;
- thread:Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样;
接下来的笔记会着重介绍这些核心的基本数据类型。
而判断变量究竟是什么类型依靠的是他的值,我们看看下面的例子:
num =
str = "abc"
obj = nil
func = print print(type(num))--number
print(type(str))--string
print(type(obj))--nil
print(type(func))--function func = str print(type(func))--string
全局和局部
默认声明的变量都是全局变量,表示可以在全局范围内进行访问,而局部变量则是在声明之前添加local关键字,如下:
local num
local str = "abc" print(num)--nil
print(str)--abc
全局变量声明时必须赋值,而局部变量则不需要。
块
do...end可以声明一个程序块,局部变量的生命周期在自己的程序块和子程序块中:
function main()
do
local num =
print(, num)--1 100
do
print(, num)--2 100
end
end
print(, num)--3 nil
end main()
运算符
算术运算符
包含“+”、“-”、“*”、“/”、“%”等运算符,但是要注意不支持自增自减运算符:
num =
--下面的写法都不支持, --直接变注释了都
num++
++num
num--
--num
--正确的写法如下
num = num +
num = num -
同时简写的形式也不支持:
num =
--简写是不支持的
num *=
--正确的写法如下
num = num *
取余运算支持小数,因为number类型是以double形式存在的:
num = 3.14
num = num %
print(num)--0.14
关系运算符
- ==:判断是否相等;
- ~=:判断是否不相等;
- <:判断是否小于;
- >:判断是否大于;
- <=:判断是否小于等于;
- >=:判断是否大于等于;
需要注意的是,table等引用类型是使用地址来进行判断的:
num1 =
num2 =
print(num1 == num2)--true str1 = "abc"
str2 = "abc"
print(str1 == str2)--true table1 = {, , }
table2 = {, , }
print(table1 == table2)--false
逻辑运算符
- and:与,等同C里的&&;
- or:或,等同C里的||;
- not:非,等同C里的!;
我们可以巧用逻辑运算符来实现C中的三元运算符:
--C 语言的写法
--d = a ? b : c
--Lua 的写法
d = (a and b) or c
控制结构
if then
条件判断语句,我们直接上个例子:
num = math.random()
print(num) if num <= 0.33 then
print("A")
elseif num <= 0.66 then
print("B")
else
print("C")
end
while和repeat
条件循环语句,while是先判断再循环,repeat是先循环再判断,例子如下:
num = --while 的条件是如果为真则继续循环
while num ~= do
num = num -
print(num)
end num = --repeat 的条件是如果为真则退出循环
repeat
num = num -
print(num)
until num ==
for
循环语句;
--步长默认为 1
for i = , do
print(i)
end --指定步长为 2
for i = , , do
print(i)
end
foreach
迭代遍历语句,写法如下:
days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} --i 表示索引, v 表示值
for i,v in ipairs(days) do
print(i, v)
end
break和return
用法和C中的一致,break用于跳出循环,而return用于跳出函数。
不支持的switch、case和continue
Lua中不支持switch-case语句,我们可以使用if elseif来代替;
Lua中不支持continue语句,参考下面的文件来实现:http://www.jb51.net/article/59099.htm
Lua在5.2的版本中加入了goto语句,可以用来实现continue的效果。
Lua学习笔记(二):基本语法的更多相关文章
- Lua 学习笔记(二)
七.再论lua函数 1.lua中的函数被认为是带有词法定界和第一类值 a.词法定界:被嵌套的函数可以访问外部函数的变量 b.第一类值: lua中的函数可以放在变量中 (函数指针?) ...
- lua学习笔记1--基础语法
print("打印日志");--单行注释 --[[ 多行注释 --]] a = --变量的类型,是由变量储存的数据决定 数据类型: number:数值类型,可以存储整数和小数 bo ...
- lua学习笔记(1)-基本语法
==============变量类型nilnumber(实数) 1 2 3.14 7.65e8string "hello world" "\n ...
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
- [转]LUA 学习笔记
Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- Lua 学习笔记(一)
Lua学习笔记 1.lua的优势 a.可扩张性 b.简单 c.高效率 d.和平台无关 2.注释 a.单行注释 -- b.多行注释 --[[ --]] 3.类型和 ...
- Lua学习笔记6:C++和Lua的相互调用
曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- I.MX6 show battery states in commandLine
#/bin/sh # I.MX6 show battery states in commandLine # 声明: # 在命令行下自动显示电池状态的信息. # # -- # set battery r ...
- 数据库语言(二):SQL语法实例整理
连接表达式: select * from student join takes on student.ID = takes.ID; 通过on后面的谓词作为连接条件,相同的属性可以出现两次,也就是等价于 ...
- Ruby基础数据类型
#数字分为证书Integer,浮点数Float(对应与其他语言中的double),和复数Complex #整数又分为Fixnum和Bignum,Fixnum和Bignum会互相转换,这些都是ruby自 ...
- hdu 1573 x问题(中国剩余定理)HDU 2007-1 Programming Contest
只是套模板而已(模板其实也不懂). 留着以后好好学的时候再改吧. 题意—— X = a[i] MOD b[i]; 已知a[i],b[i],求在[1, n]中存在多少x满足条件. 输入—— 第一行一个整 ...
- POJ 3321- Apple Tree(标号+BIT)
题意: 给你一棵树,初始各节点有一个苹果,给出两种操作,C x 表示若x节点有苹果拿掉,无苹果就长一个. Q x查询以x为根的子树中有多少个苹果. 分析: 开始这个题无从下手,祖先由孩子的标号不能确定 ...
- 将VLC库封装为duilib的万能视频播放控件
转载请说明出处,谢谢~~ 昨天封装好了基于webkit的浏览器控件,修复了duilib的浏览器功能的不足,而我的仿酷狗播放器项目中不光需要浏览器,同时也需要视频播放功能,也就是完成MV的功能.所以我打 ...
- 告别where 1=1 最佳方案分享
已经有2年没有用过where 1=1了,没想到换了家公司后,又让我看到了它.在网络上面搜索了一下,发现没有人提供一个比较好的方案来解决这一问题.很多人说可以让数据库的优化机制去处理,但是,我想对于大部 ...
- ADO.NET 中的数据并发
当多个用户试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响.处理这种情况的系统叫做“并发控制”.并发控制的类型通常,管理数据库中的并发有三种常见的方 ...
- 重新安装Photoshop CS6以后启动软件出现Licensing for this product has expired
当我们卸载试用版本Photoshop CS6并且重新安装,出现Licensing for this product has expired,并且无法打开软件,这是由于证书过期导致的,解决办法是将计算机 ...
- auto printer 自动打字机效果
前段时间在知乎上看到了一个打字机的效果,所以,心血来潮,自己也来写了一个打字机的效果. 比较简单,但还有待优化的地方,因为自己感觉这个效果不够炫,等哪天想出好的点子了.再来更新…… 代码效果预览地址: ...