lua-study

Lua语法基础

Lua令牌标记

Lua程序由各种标记组成,标记可是关键字,标识符,常量,字符串或符号.

1
io.write("Hello World, from",_VERSION,"\n")

注释

Lua的注释以—开头结尾

1
2
--- 这里是注释
print("23333")

Lua变量

根据变量范围,Lua变量有三种类型:

  • 全局变量
    所有变量被声明为全局变量,除非明确声明为局域变量
  • 局域变量
    当变量指定类型为local时,其单位受函数范围的限制
  • 表字段
    这是一种特殊类型的变量,可以保存nil之外的任何对象

Lua变量声明和定义

变量定义告诉解释器为变量创建存储的位置和数量,变量具有可选类型,并且包含该类型一个活多个变量的列表(吐槽: 要跟python列表弄混了)

1
type variable_list

这里,type是可选的本地或全局类型.而variable_list可以包含一个或多个由逗号分隔的标识符名称.

1
2
3
local i,j
local i
local a,c

变量可以在声明时初始化:

1
2
3
4
5
6
7
local a, b = 0, 1
c, d = 2, 3
e,f = 4

print(e,f)
--- 4 nil
--- 注意这里只赋给了e,没有赋给f

Lua可以像py那样平行赋值

1
2
3
4
5
a = 0
b = 1
a, b = b, a
print(a, b)
--- 1 0

Lua数据类型

Lua是一种动态类型语言,即 变量没有类型,只有值有类型

数据类型:

值类型 描述
nil 用于区分值与某些数据或没有数据(类似js里的null或py里的None?)
boolean boolean
number 表示实数(双精度浮点)数字
string 表示字符数组
function 表示用C语言或Lua编写的方法
userdata 表示任意C语言数据
thread 表示独立的执行线程,用于实现协同程序
table 表示普通数组,符号表,集合,记录,图形,树等,并实现关联数组.它可以保存任何nil以外的值

type函数

1
2
print(type(0))
---number

默认情况下,在分配值或初始化之前,所有变量都指向nil.

Lua字符串

Lua字符串可以用三种形式初始化

  • 单引号之间的字符串
1
'lua'
  • 双引号之间的字符串
1
"lua"
  • [[和]]之间的字符串
1
2
[[lua hhhhhhhh
aaaaaaa]]

[[和]]之间的字符串可以换行,类似py的三个引号的字符串

字符串操作

方法 作用
string.upper(“Some String”) 返回参数的大写表示
string.lower(“Some String”) 返回参数的小写表示
string.gsub(“Some String”, “S”, “啊”) 类似py的replace
string.find(“Some String”, “S”) 返回mainStr中,findStr的起始位置和结束位置.
我佛辣,这个lua怎么索引都是从1开始的
string.reverse(“Some String”) 返回参数的倒序字符串
string.format(“Some String %d %s”,12,“ccc”) 格式化字符串
string.char(“Some String”)和string.byte(“Some String”) 不解释
string.len(“Some String”) 返回长度
ntm不是有#运算符了么???
string.rep(“Some String”,2) 返回参数字符串重复n次后的结果
…运算链接两个字符串

Lua数组

1
2
3
4
5
6
7
array = {"a", "b"}
print(array[0])
--- nil
print(array[1])
--- a
print(array[2])
--- b

Lua数组的索引是从1开始的…

Lua数组接受负数和0索引

1
2
3
4
array = {}
array[-1] = 10
print(array[-1])
--- 10

Lua运算符

算术运算符

以下是Lua语言支持的所有算术运算符.假设变量A=10, B=20

运算符 描述 示例
+ 两相加操作数 A + B : 30
- 第一个减去第二个操作数 A - B : -10
* 将两个操作数相乘 A * B : 200
/ 第一个操作数除以第二个操作数 A / B : 2
% 模数运算符,去整除后的余数 B % A : 0
^ 指数运算符,取指数幂值 A ^ 2 : 100
- 一元运算符,充当否定 -A : -10

关系运算符

关系运算符
==, >, <, >=, <=等,跟其他语言差不多.
注意不等于是~=,而非!=

逻辑运算符

and, or, not,和python用起来差不多,只是lua的not只能用于处理布尔值,没有像python那样的a not == b,只能not a == b

杂项运算符

运算符 描述 示例
连接两个字符串.惊了,连接字符串不能用+的,只能用这个… “111”…“233” : 111233
# 返回字符串或表长度的一元运算符 #“abc” : 3

Lua的循环

while循环

1
2
3
4
while(condition)
do
statement(s)
end
1
2
3
4
5
6
7
a = 10

while( a < 20 )
do
print("value of a:", a)
a = a + 1
end

(惊了,lua不支持a += 1这种)

for循环

1
2
3
4
for init, max/min value, increment
do
statement(s)
end

上面代码中:

  • init首先执行,只执行一次,此步骤允许声明和初始化任何循环控制变量(什么任何?)
  • 接下来执行max/min.这是循环继续执行的最大值或最小值.它在内部创建条件检查,以比较初始值和最大/最小值
  • 在执行for循环体之后,控制流会跳回increment/decrement语句.此语句用于更新循环控制变量.
  • 再次评估条件.如果为真,则循环执行并且过程自身重复(循环体,然后递增步骤,然后再次调节).条件变为false后,for循环终止
1
2
3
4
for i = 1, 10, 1
do
print(i)
end

…这语法…我佛辣
顺便试了一下,lua用不着游标卡尺…

repeat…until循环

与在顶部测试循环条件的for和while不同,lua的repeat…until循环在底部检查循环的条件.
repeat…until循环类似while循环,但是repeat…until循环保证至少执行一次.

1
2
3
4
5
6
x = 100
repeat
x = x + 1
print(x)
until x > 10
---101

循环控制声明

有break,好像没有continue

Lua流程控制

1
2
3
4
if(boolean)
then
dosomething
end
1
2
3
4
5
6
if(boolean)
then
dosomething
else
dosomething
end
1
2
3
4
5
6
7
8
9
if(boolean)
then
dosomgthing
elseif(boolean)
then
dosomething
else
sosomething
end

注意: elseif后面需要then,else后面没有

Lua函数

Lua中编程语言中的方法定义一般形式如下:

1
2
3
4
5
6
7
optional_function_scope function function_name( argument1, argument2, argument3........, 
argumentn)

function_body

return result_params_comma_separated
end
  • 可选函数范围
    使用local关键字来限制函数范围或者忽略该部分,使之成为一个全局函数
  • 函数名称
    函数的实体名称
  • 参数
  • 函数主体
  • 返回

示例:max函数

1
2
3
4
5
6
7
8
9
10
function max(num1, num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end

print(max(1,255))

可变参数函数

使用…作为参数在lua中创建具有可变参数的函数.

1
2
3
4
5
6
7
8
9
10
function average(...)
result = 0
local arg = {...}
for i,v in ipairs(arg) do
result = result + v
end
return result/#arg
end

print("The average is",average(0))

Lua迭代器

迭代器泛型

迭代器泛型提供集合中每个元素的键值对.

1
2
3
4
5
6
7
8
array = { "a", "b" }

for k, v in ipairs(array)
do
print(k, v)
end
--- 1 a
--- 2 b

上面这个例子使用了Lua提供的默认的ipairs迭代器
在Lua中,使用函数来表示迭代器.基于这些迭代器函数中的状态维护,有两种主要类型:

无状态迭代器

这类迭代器不会保留任何状态.

Lua表

表是lua中唯一可用的数据结构.使用表可用创建不同的类型,比如数组和字典.
Lua使用关联数组,不仅可用数字编制索引,还可以使用除nil之外的字符串编制索引.

1
2
3
a = {}
a["a"] = 233
print(a["a"])

表示和用法

表称为对象,它既不是值也不是变量.Lua是哟构造函数{}来创建一个空表.

表操作

表连接

使用concat函数连接表

table.concat (table [, sep [, i [, j]]])

1
2
3
4
5
6
7
8
9
10
fruits = { "bbb", "ccc", "ddd" }

print(table.concat(fruits))
--- bbbcccddd

print(table.concat(fruits, ", "))
--- bbb, ccc, ddd

print(table.concat(fruits, ", ", 2, 3))
--- ccc, ddd

插入和删除

table.insert (table, [pos,] value)
table.remove (table [, pos])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
arr = { "bbb", "ccc", "ddd" }

table.insert(arr,"aaa")
print(table.concat(arr," "))
--- bbb ccc ddd aaa

table.insert(arr,1,"eee")
print(table.concat(arr," "))
--- eee bbb ccc ddd aaa

table.remove(arr)
print(table.concat(arr," "))
--- eee bbb ccc ddd

table.remove(arr, 3)
print(table.concat(arr," "))
--- eee bbb ddd

排序

1
2
3
4
5
arr = { "e", "b", "d", "c", "a" }
print(table.concat(arr," "))

table.sort(arr)
print(table.concat(arr," "))