Lua 基础

2020-05-06 15:34:48 浏览数 (1)

【转载请注明出处】:https://juejin.im/post/5eae252ae51d454db7436a26

基本语法

注释
  • 两个减号是单行注释: --注释
  • 多行注释 --[[ 注释 --]]标示符标示符以字母或下划线 _ 开头,加上字母、下划线或数字组成。 最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。
关键词

以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标示符:

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

一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。

全局变量

在默认情况下,变量总是认为是全局的。

Lua 数据类型

Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。

数据类型

描述

说明

nil

这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。

nil 作比较时应该加上双引号

boolean

包含两个值:false和true。

Lua 把 false 和 nil 看作是"假",其他的都为"真"

number

表示双精度类型的实浮点数

string

字符串由一对双引号或单引号来表示

也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。 使用 # 来计算字符串的长度 在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字

function

由 C 或 Lua 编写的函数

userdata

表示任意存储在变量中的C数据结构

thread

表示执行的独立线路,用于执行协同程序

table

Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

可以使用type函数测试给定变量或者值的类型。

Lua 变量

Lua 变量有三种类型:全局变量、局部变量、表中的域。

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

赋值语句
代码语言:txt复制
--赋值是改变一个变量的值和改变表域的最基本的方法。
a = "hello" .. "world"
t.n = t.n   1

--Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。
a, b = 10, 2*x     -- 等价于  a=10; b=2*x

当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

  • 变量个数 > 值的个数 按变量个数补足nil
  • 变量个数 < 值的个数 多余的值会被忽略
索引

对 table 的索引使用方括号 []。Lua 也提供了 . 操作。

代码语言:txt复制
t[i]
t.i     -- 当索引为字符串类型时的一种简化写法

Lua 循环

Lua 语言提供了以下几种循环处理方式:

循环类型

描述

while 循环

在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。

for 循环

重复执行指定语句,重复次数可在 for 语句中控制。

repeat...until

重复执行循环,直到 指定的条件为真时为止

循环嵌套

可以在循环内嵌套一个或多个循环语句(while do ... end;for ... do ... end;repeat ... until;)

while 循环
代码语言:txt复制
while(condition)
do
   statements
end
数值for循环

Lua 编程语言中数值for循环语法格式:

代码语言:txt复制
for var=exp1,exp2,exp3 do  
    statements
end  

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 "执行体"。exp3 是可选的,如果不指定,默认为1。

泛型for循环

泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。

代码语言:txt复制
for i, v in ipairs(value) do
     statements
end 

i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

repeat...until 循环
代码语言:txt复制
repeat
   statements
until( condition )

Lua 流程控制

Lua 提供了以下控制结构语句:

语句

描述

if 语句

if 语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。

if...else 语句

if 语句 可以与 else 语句搭配使用, 在 if 条件表达式为 false 时执行 else 语句代码。

if 嵌套语句

你可以在if 或 else if中使用一个或多个 if 或 else if 语句 。

if 语句
代码语言:txt复制
if(condition)
then
   statements
end
if...else 语句
代码语言:txt复制
if(condition)
then
  statements1
else
   statements2
end
if...elseif...else 语句
代码语言:txt复制
if(condition1)
then
  statements1
elseif(condition2) 
then
   statements2
else 
   statements3
end

Lua 函数

函数定义
代码语言:txt复制
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end
  • optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
  • function_name: 指定函数名称。
  • argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
  • function_body: 函数体,函数中需要执行的代码语句块。
  • result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
多返回值

Lua函数中,在return后列出要返回的值的列表即可返回多值。

可变参数

Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。

有时候可能需要几个固定参数加上可变参数,则固定参数必须放在变长参数之前。

通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select('#', …) 或者 select(n, …)

  • select('#', …) 返回可变参数的长度function average(...) result = 0 local arg={...} for i,v in ipairs(arg) do result = result v end return result/#arg --或者 return result/select("#",...) end
  • select(n, …) 返回它的第n个可变实参

Lua 运算符

算术运算符

操作符

描述

加法

-

减法/负号

*

乘法

/

除法

%

取余

^

乘幂

关系运算符

操作符

描述

==

等于,检测两个值是否相等,相等返回 true,否则返回 false

~=

不等于,检测两个值是否相等,相等返回 false,否则返回 true

大于,如果左边的值大于右边的值,返回 true,否则返回 false

<

小于,如果左边的值大于右边的值,返回 false,否则返回 true

=

大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false

<=

小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false

逻辑运算符

操作符

描述

and

逻辑与操作符。

or

逻辑或操作符。

not

逻辑非操作符。

其他运算符

操作符

描述

..

连接两个字符串

一元运算符,返回字符串或表的长度。

运算符优先级

|从高到低的顺序|

| - |

| ^ |

| not - (unary) |

| * / |

| - |

| .. |

| < > <= >= ~= == |

| and |

| or |

除了^和..外所有的二元运算符都是左连接的。

Lua 字符串

Lua 语言中字符串可以使用以下三种方式来表示:

  • 单引号间的一串字符。
  • 双引号间的一串字符。
  • [和]间的一串字符。
字符串操作

方法

用途

string.upper(argument)

全部转为大写

string.lower(argument)

全部转为小写

string.gsub(mainString,findString,replaceString,num)

在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换成的字符,num 替换次数(可以忽略,则全部替换)

string.find (mainString, findString, [startIndex, endIndex])

在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。

string.reverse(arg)

字符串反转

string.format(...)

返回一个类似printf的格式化字符串

string.char(ASCIICodes...)

将ASCII码转成字符并连接

string.byte(str,index)

将指定的字符转成ASCII码(默认第一个字符)

string.len(arg)

计算字符串长度

string.rep(str, n)

返回字符串string的n个拷贝

..

链接两个字符串

string.gmatch(str, pattern)

返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。

string.match(str, pattern, init)

string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。

Lua 数组

Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。

可以使用整数索引来访问数组元素,如果指定的索引没有值则返回nil。

Lua 索引值是以 1 为起始,但也可以指定 0 开始,除此之外还可以以负数为数组索引值。

Lua 迭代器

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址

在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。

泛型 for 迭代器

泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。

泛型 for 迭代器提供了集合的 key/value 对,语法格式如下:

代码语言:txt复制
for k, v in pairs(t) do
    print(k, v)
end

k, v为变量列表;pairs(t)为表达式列表。

Lua 的迭代器包含以下两种类型:
无状态的迭代器

无状态的迭代器是指不保留任何状态的迭代器,因此在循环中可以利用无状态迭代器避免创建闭包花费额外的代价。

每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。

例如使用一个简单的函数来实现迭代器,实现数字 n 的平方:

代码语言:txt复制
function square(iteratorMaxCount,currentNumber)
   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber 1
   return currentNumber, currentNumber*currentNumber
   end
end

for i,n in square,3,0
do
   print(i,n)
end
多状态的迭代器

很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到table内,将table作为迭代器的状态常量,因为这种情况下可以将所有的信息存放在table内,所以迭代函数通常不需要第二个参数。

例如:

代码语言:txt复制
function elementIterator (collection)
   local index = 0
   local count = #collection
   -- 闭包函数
   return function ()
      index = index   1
      if index <= count
      then
         --  返回迭代器的当前元素
         return collection[index]
      end
   end
end

array = {"Lua", "Tutorial"}
for element in elementIterator(array)
do
   print(element)
end

Lua table(表)

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

Lua table 使用关联型数组,可以用任意类型的值来作数组的索引,但这个值不能是 nil。

Lua table 是不固定大小的,可以根据自己需要进行扩容。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。

方法

用途

table.concat (tableObj [, separator [, startIndex , endIndex]])

列出tableObj从startIndex位置到endIndex位置的所有元素, 元素间以指定的分隔符(separator)隔开。

table.insert (tableObj, index, value)

在tableObj的指定位置(index)插入值为value的一个元素。index参数可选, 默认为末尾。

table.remove (tableObj , index)

返回tableObj位于index位置的元素。 其后的元素会被前移。index参数可选, 默认为table长度, 即从最后一个元素删起。

table.sort (tableObj , comp)

对给定的table进行升序排序。comp应满足以下条件: 接受两个参数(依次为a, b), 并返回一个布尔型的值, 当a应该排在b前面时, 返回true, 反之返回false.

【转载请注明出处】:https://juejin.im/post/5eae252ae51d454db7436a26

0 人点赞