lua基础知识点总结

 

目录

1.Lua安装

2. 注释

3.Lua中的数据类型

3.1 nil(空)

3.2  boolean(布尔)

3.3 number(数字)

3.4 string(字符串)

3.5 table(表)

3.6 function(函数)

4.全局变量

多变量同时赋值

5.Lua 循环

5.1  while循环

5.2  for循环

5.3  repeat until循环(do...while)

5.4 无限循环(这里就不运行了,你懂的。)

5.5 循环嵌套

6.Lua流程控制

7.Lua函数

可变参数

8.Lua运算符

运算符优先级

9.转义字符:

10.Lua字符串

11.数组(在 Lua 中索引值默认是以 1 为起始,但你也可以指定 0或其他值 开始。)

  一维数组:

多维数组:

12.Lua中的迭代器函数-pairs ipairs

自定义Lua迭代函数


1.Lua安装

       Lua下载路径:https://github.com/rjpcomputing/luaforwindows/releases

 

   Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

      C#都要编译成dll才能运行,而lua可以直接把源文件放到程序里边。

      lua语句可不写分号“;”

2. 注释

      单行:--                多行:--[[     --]]

3.Lua中的数据类型

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

print(type("helloWorld"))
print(type(10))
print(type(1.1))
print(type(print))
print(type(type))
print(type(nil))
print(type(x))

3.1 nil(空)

         nil 类型表示一种没有任何有效值,它只有一个值 -- nil

       对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉

tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

print("--------------")

tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

3.2  boolean(布尔)

     boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真":

if false or nil then
    print("至少有一个是 true")
else
    print("false 和 nil 都为 false!")
end

print("-------------")
print(type(true))
print(type(false))
print(type(nil))

3.3 number(数字)

       Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:

print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

3.4 string(字符串)

     Lua中,“+”只能做加法运算,不能做字符串组拼,字符串组拼用“..

str1="this is string1"
str2="this is string2"

print("2".."6")
print("2"+"6")

print("2"+6)
print("2+6")
print("2e2"*"6")

print("--------")

print(#str1)

3.5 table(表)

在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:

tab1 = {}        -- 创建一个空的 table
print(tab1)
print(tab1.key)
print("--------------")

tab1.key1="lijiang"
tab1["key2"]="lijiang"
tab1[10]=1000
print(tab1.key1)
print(tab1["key1"])
print(tab1.key2)
print(tab1["key2"])
print(tab1[10])
print(tab1[2])
print("--------------")

print(tab1[1])
tab1[1]=100
print(tab1[1])
print(tab1["key1"])
print("--------------")

tab2={key1=100,key2="value2"}
print(tab2.key1)
print(tab2["key1"])
print(tab2[1])
print(tab2["1"])
print("--------------")


tab3 = {"apple", "pear", "orange", "grape"}  -- 直接初始表
print(tab3[2])
print(tab3["2"])
print(tab3["pear"])
print(tab3["key2"])

Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。 

a = {}
a["key1"] = "value"

key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。

local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。

a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

3.6 function(函数)

在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里:

function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(4))
factorial2 = factorial1
print(factorial2(4))

function 可以以匿名函数(anonymous function)的方式通过参数传递:

function testFun(tab,fun)
    for k ,v in pairs(tab) do
        print(fun(k,v));
    end
end

tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数
    return key.."="..val;
end
);

4.全局变量

变量在使用前,必须在代码中进行声明,即创建该变量。

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

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

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

变量的默认值均为 nil。

全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

print(b)

b=10
print(b)

如果你想删除一个全局变量,只需要将变量赋值为nil。

b=nil
print(b)

这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。

多变量同时赋值

a, b, c = 0, 1
print(a,b,c)

a, b = a+1, b+1, b+2
print(a,b)

a,b=b,a
print(a,b)

a, b, c = 0
print(a,b,c)
print("------------")

function test()
      return 10,20
end
a,b=test()
print(a,b)

5.Lua 循环

5.1  while循环

格式:
while (condition) do
     statements
end
a=1
while (a<5) do
 print(a)
 a=a+1
end

 

5.2  for循环

        1.数值for循环

格式:(这里var会从start变化到end,每次变化step。step默认为1)
for var=start,end,step do 
        循环体
end
for i=1,10,2 do
	print(i)
end

        2.泛型for循环

tab1={key1="lijiang",key2=10}
for k,v in pairs (tab1) do
    print(k,v)
end

5.3  repeat until循环(do...while)

a=1
repeat
    print(a)
	a=a+1
until(a>5)

5.4 无限循环(这里就不运行了,你懂的。)

while( true )
do
   print("循环将永远执行下去")
end

可用break退出

5.5 循环嵌套

for i=1,4 do
  for j=1,i do
    print(i)
  end
end

或者:

for i=1,4 do
  j=1
  while j<=i do
    print(i)
	j+j+1
  end
end

6.Lua流程控制

--当条件表达式为false或此处为nil时,为false;其余情况都为true
if(condition为true)  then  

  xxx
end


if(condion为true)  then
  xxx
else
  xxx
end


if(condition为true) then
    xxx
  elseif() then
    xxx
  elseif() then
    xxx
end

7.Lua函数

local function max(num1,num2)
       if(num1>num2) then
	      return num1
	    else
		  return num2
		end
	end
print(max(1,10))
print("-----------")

temp=max
print(temp(2,5))


myprint=function(param)
   print("这是我的打印函数:"..param)
end
myprint(100)
print("-----------")

function add(a,b,printFun)
         res=a+b
		 printFun(res)
end
add(20,30,myprint)
print("-----------")

function tem()
   return 1,3,54,65
end
a,b,c,d,e,f=tem()
print(a,b,c,d,e,f)

可变参数

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

--lua里面的函数可以返回多个值
function test(...)
   local arg={...}
   res=0
   for k,v in pairs(arg) do
	  res=res+v
	end
    print(res)
end

test()
test(10)
test(1,2)
test(1,2,3,4,5)

8.Lua运算符

其他的和c#差不多,不同的是:

      不等于:~=              and / or / not

.. 连接两个字符串 a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。
# 一元运算符,返回字符串或表的长度。 #"Hello" 返回 5

运算符优先级

从高到低的顺序:

^
not    - (unary)
*      /
+      -
..
<      >      <=     >=     ~=     ==
and
or

9.转义字符:

--字符串定义: “” , ‘’ ,[[]]
--转义字符 :\n 换行   \\代表一个反斜杠  \"代表"  \'代表'


a='Hello\nWorld\\hahaha'
print(a)
b=" \'    \" "
print(b)

10.Lua字符串

Lua 提供了很多的方法来支持字符串的操作:

序号 方法 & 用途
1 string.upper(argument):
字符串全部转为大写字母。
2 string.lower(argument):
字符串全部转为小写字母。
3 string.gsub(mainString,findString,replaceString,num)
在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:
> string.gsub("aaaa","a","z",3);
zzza    3
4 string.find (str, substr, [init, [end]])
在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。
> string.find("Hello Lua user", "Lua", 1) 
7    9
5 string.reverse(arg)
字符串反转
> string.reverse("Lua")
auL
6 string.format(...)
返回一个类似printf的格式化字符串
> string.format("the value is:%d",4)
the value is:4
7 string.char(arg) 和 string.byte(arg[,int])
char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。
> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65
>
8 string.len(arg)
计算字符串长度。
string.len("abc")
3
9 string.rep(string, n)
返回字符串string的n个拷贝
> string.rep("abcd",2)
abcdabcd
10 ..
链接两个字符串
> print("www.runoob".."com")
www.runoobcom

11.数组(在 Lua 中索引值默认是以 1 为起始,但你也可以指定 0或其他值 开始。)

  一维数组:

a={}
a[-2]=1
print(a[-2])

b={-1,0,1}
print(b[-1],b[0],b[1])

多维数组:

array = {{},{},{}}
for i=1,3 do
      for j=1,3 do
         array[i][j] = i*j
		 print(array[i][j])
      end
end

arr={{"张三","李四"},{"王五","赵六"},{"前期","孙吧"}}
print(arr[1][1])
print("---------")

-- 访问数组
for i=1,3 do
   for j=1,2 do
      print(arr[i][j])
   end
end

12.Lua中的迭代器函数-pairs ipairs

pairs迭代table,遍历表中所有的key和value

ipairs按照索引从1开始,递增遍历,遇到nil就停止

arr={"lua","c","java"}
for k,v in pairs(arr) do
     print(k,v)
end
print("----------")

arr[2]=nil
for k,v in ipairs(arr) do
     print(k,v)
end

自定义Lua迭代函数

  for 变量列表 in 迭代函数,状态变量,控制变量 do
          循环体
   end

1.调用迭代函数,把状态变量和控制变量当做参数传递给迭代函数,状态变量只会在第一次调用的时候赋值

2.如果迭代函数的返回值为nil,退出for循环。如果不是nil的话,把返回值赋值给变量列表,并执行循环体

function square(state,control)
   if(state<=control) then
         return nil
    else
	    control=control+1
		return control,control*control
	end
end

for i,j in square,4,0 do
    print(i,j)
end

13.Lua table(表)

Table 连接

mytable={"lua","java","c++","c#","c"}
print(table.concat(mytable))
print(table.concat(mytable,","))      --中间用逗号隔开    
print(table.concat(mytable,",",2,4))  --只连接索引2到4的数据

Table 插入

mytable={"lua","java","c++","c#","c"}
print(#mytable)
print(mytable[#mytable])
print("-----------")

mytable[#mytable+1]="php"
print(mytable[#mytable])
print("-----------")

table.insert(mytable,"javascript")
print(mytable[#mytable])
print("-----------")

table.insert(mytable,2,"Boo")
print(mytable[1],mytable[2],mytable[3])

Table 删除表内数据

mytable={"lua","java","c++","c#"}
print(mytable[1],mytable[2],mytable[3],mytable[4])
print("-----------")

table.remove(mytable,2)
print(mytable[1],mytable[2],mytable[3],mytable[4])
print("-----------")

mytable[1]=nil
print(mytable[1],mytable[2],mytable[3],mytable[4])

Table 排序- sort()函数

fruits = {"banana","orange","apple","grapes"}
print("排序前:")
for k,v in ipairs(fruits) do
    print(k,v)
end

table.sort(fruits)
print("排序后:")
for k,v in ipairs(fruits) do
    print(k,v)
end

Table 最大值

mytable={123,64,4,34,76,567,8,23}

function GetMaxNum(tab)
  local tem=0
  for k,v in pairs(tab) do
        if(tem<v) then
		   tem=v
		end
	end
	return tem
end

print("表中最大值:",GetMaxNum(mytable))

14.Lua 模块(相当于“类”)

--文件名:module.lua

module = {}
module.constant = "这是一个常量"  -- 定义一个常量
function module.func1()  -- 定义一个函数
    io.write("这是一个公有函数!\n")
end

local function func2()
    print("这是一个私有函数!")
end

function module.func3()
    func2()
end

return module

Lua提供了一个名为require的函数用来加载模块 

-- test_module.lua 文件
-- module 模块为上文提到的 module.lua

require("module")

print(module.constant)

module.func3()

或者给加载的模块定义一个别名变量,方便调用:

-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
 
print(m.constant)
 
m.func3()

15.Lua 元表(Metatable)

猜你喜欢

转载自blog.csdn.net/qq_40323256/article/details/84102722