Lua学习笔记:Lua基础语法

前言

虽然接触Lua已经很久了但是一直以来也没有做很完整的笔记,以至于长时间不用就会容易生疏,所以做一下笔记以便以后拿出来翻阅。

初始Lua

  • 第一次接触Lua感觉这玩意的语法和python、js很像,解释型语言、弱类型等等,写起来是真省心,维护起来是真费事…
  • 作为游戏的脚本热更起来是真舒服,有问题抛一个AB包搞定。

基本语法

变量

  • 只有布尔、字符串、数字、table和nil。但是没有一个明确的类型定义,完全按照赋值来进行推断是什么类型。
  • 默认是public,如果想private需要变量前加local。
  • 可以一次性多复制,如果变量和值不对称,没有复制的变量为nil。(如下)

     1   2   3   4   5   6   7   8   9  
    
    a,b,c = 1,2  
print(a)  
print(b)  
print(c)  
  
1  
2  
nil  
-- 要想不为空必须对等赋值:a,b,c = 1,2,3  

—|—

作用域

  • 在Lua中一个local的作用域可以是一个循环、一个table(和c#中的class类似)、也可以是一个 do end,是如果你想控制一个local变量的值作用域某个区间,那么可以使用do end来明确划分一个block。如下,第一段代码print(a)结果为空,因为a是local并且作用域是do end,第二段代码因为外部有全局的a变量,所以可以打印出10

     1   2   3   4  
    
    do  
 local a = 1  
end  
print(a) -- 结果为nil  

—|—

1  
2  
3  
4  
5  
6  
a = 10  
do  
 local a = 1  
 print(a)  
end  
print(a) -- 结果为1    10  

—|—

循环 forwhile dorepeat until

  • 需要注意的是for循环默认是从1开始的,这个很不爽容易造成我们写程序误判,尤其是c#和lua交互的时候需要注意

    1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21  
    
    local ta = {1,2,3,4,5}  
for i = 1, #ta do  
print(i) -- 结果 1 2 3 4 5  
end  
```    
``` lua  
-- 循环从0开始的示例  
local ta = {1,2,3,4,5}  
for i = 0, #ta do  
print(i) -- 结果 0 1 2 3 4 5  
end  
```   
- **while do**  
``` lua  
a=10  
while( a < 20 )  
do  
   print("a 的值为:", a)  
   a = a+1  
end  
-- a 的值为: 10 a 的值为: 11 ..... a 的值为: 19  

—|—

  • repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。

    1   2   3   4   5   6  
    
    a = 10  
repeat  
   print("a的值为:", a)  
   a = a + 1  
until( a > 15 )   
-- a的值为: 10 a的值为:11 ..... a的值为:15  

—|—

迭代

  • lua中除了for循环还可以用迭代,需要注意pairs 和 ipairs异同

相同:都是能遍历集合(表、数组)
不同:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
pairs能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。

    1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
    local tabFiles = {  
        [1] = "test2",  
        [6] = "test3",  
        [4] = "test1"  
    }  
for k,v in ipairs do  
print(k.."---"..v)  
end      
-- 结果 程序会在test2处断开  
  
for k,v in pairs do  
print(k.."---"..v)  
end  
-- 结果会输出 1---test2 6---test3 4---test1  

—|—

table

终于写到强大的table了,table是lua中的数据结构,可以用来做数组、字典、还可以用来模拟类等等
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
table是不固定大小的,可以根据需要进行扩容

数组

1  
local arry = {1,2,3} -- 下标是从1开始的  

—|—

字典

1  
local dic = {name = "小明",sex = "男"}  

—|—

table容易出现的问题

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
temp = 1  
tab = {[temp] = 1, 11}  
print(tab[1])  
for i,v in pairs(tab) do  
	print(i,v)  
end  
  
-- 输出的结果是 :   
11  
1	11  

—|—

why?第一个print中为何结果不是1,因为tab[]这个用法的参数是key,而像11这样没有显示定义key的value默认的key就是1,所以这句话认为是输出key=1的value了。而且从遍历看居然只有一个数据,也就是说value 1的数据被替换掉了。
所以使用table这种数据结构时注意下面几点:

  • 所有元素之间,总是用逗号 “,” 隔开;

  • 所有索引值都需要用 “[“和”]”括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引

  • 如果不写索引,则索引就会被认为是数字,并按顺序自动从 1往后编;

函数

  • function可以返回也可以不返回结果,在定义时没有明确的约束。

  • 支持多返回值。

  • Lua函数不支持参数默认值,可以通过or来实现。

    1   2   3   4   5   6   7  
    
    function (a , b)  
    a = a or 1.1  
    b = b or 2.2  
    return a + b  
end  
   
print(sum())  

—|—

  • 支持闭包

    1   2   3   4   5   6   7   8   9   10   11   12   13  
    
    tab = {1,2,3,4,5,6,7,8}  
   
function iter()  
    local index = 0  
    return function()  
        index = index + 1   
        return tab[index]  
    end  
end  
   
for i in iter() do  
   print(i)  
end  

—|—

  • 支持可变参数

    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  
   print("总共传入 " .. #arg .. " 个数")  
   return result/#arg  
end  
print("平均值为",average(10,5,3,4,5,6))  

—|—

:和.的区别

这个也是很多接触lua的新手容易迷惑的地方,其实:是个语法糖,调用的函数会自动传递参数self

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
local a = {x = 0}  
function a.foo(self, a)  
    self.x = a  
end  
  
function a:foo(a)  
    self.x = a  
end  
  
-- 调用时  
a.foo(a, 2)  
a.foo2(2)  

—|—

糖果

糖果
LUA教程

如果不小心安装错 SQL Server 为 Evaluation 的版本,要小心当超过 180 天之后,系统就会无法正常使用了 这几天遇到一个蛮特别的案例,原本收到的问题是 “维护计划” 忽然无法使用,即便是里面没有任何的Task,都无法顺利地执行。但从对方所提供的错误消...… Continue reading

PLUM NIZ静电容键盘怎么样?

Published on September 25, 2020

程序员如何选择合适的机械键盘

Published on September 18, 2020