Lua 语法 Table 与模块|学习笔记

简介: 快速学习 Lua 语法 Table 与模块

开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第一阶段Lua 语法 Table 与模块】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/669/detail/11605


Lua 语法- Table 与模块

 

内容介绍

一. Lua table

二. Lua 模块与包

三. 总结


一. Lua table

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如,数字、学典等。 Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil

这里的 table 只是 lua 的一个数据类型,索引稍后会讲到。

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

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

--table

mytable={}

mytable.first="tom"

mytable.second="james"

(写数据)

真正的数据是 tom,james,而 first,second 是索引:类似于 map 里的 key 和value。

print(mytable[1])

print(mytable.first)

print(mytable["second"])

(读数据)

可以通过“.”的方式,也可以通过“[ ]+‘’把索引加进去。print(mytable[1])

的角标1可以拿掉吗?答案是不可以。下面来看一下实例:

重新定义一个 test08.lua“[New File]

输入空的 table:

[root@clintnode testlua]#

[root@clintnode testlua]# vi test08.lua

mytable={ }

mytable.aa="aaaaa

mytable.bb="bbbbb

mytable.cc=123

print(mytable.aa)

print(mytable.bb)

print(mytable.cc)

保存,然后执行脚本:

test08.lua" [New] 12L, 123c written

[root@clintnode testlua]#

[root@clintnode testlua]#

[root@clintnode testlua]# lua  test08.lua

Aaaaa

Bbbbb

123

[root@clintnode testlua]#

可以看到 abc 全部出来了。那么数据类型是什么样的呢?

print(type(mytable.aa) 

print(type(mytable.bb)

print(type(mytable.cc)

回车

"test08.lua" 12L, 141c written

[root@clintnode testlua]#

[root@clintnode testlua]# lua test08.lua

string

string

number

[root@clintnode testlua]#

以上就是 table 的存储数据获取数据。获取还有一种方式:【】加“”,并且其中一个换成角标1:

也就是:

print(mytable.aa)

print(mytable["bb"])

print(mytable[1])

test08.lua"  12L, 126c  written

[root@clintnode testlua]#

[root@clintnode testlua]#

[root@clintnode testlua]# lua  test08.lua

aaaaa

bbbbb

nil

[root@clintnode testlua]#

可见角标1没有拿出来,因为没有任何一个索引的名字叫[1],所以这种方法是不可以的。

 

二. Lua 模块与包

module.lua 文件

module=0

module.index=1

function module.sum(a,b)

return a+b

end

Lua 模块与包如何实现?依然在 table 基础上有个空 table,table 里面有个 index index 是它的索引,那真正的值是1,而这里面包和模块怎么做?在 table 里面,可以看前面在输出的时候,数据类型:

"test08.lua" 12L, 141c written

[root@clintnode testlua]#

[root@clintnode testlua]# lua test08.lua

string

string

number

[root@clintnode testlua]#

数据类型是多种数据类型。那么函数可以吗?

module=0

module.index=1//module 是 table 名称,第一个值是1

function module.sum(a,b)//第二个值是 table.sum,sum 承载了参数,前面加了function,也就是变成了函数

return a+b

end

在 table 中添加了一个值,这个值是一个函数类型,有参有返回,这样就将函数所具有的功能都嵌入到了 table 里面。Table 里有多个值,其中一个是函数。函数能承载的功能,table 也可以做。下面来实例:

mytable={}

mytable.aa="aaaaa“

mytable.bb="bbbbb”

mytable.cc=123

function mytable.sum(a,b)

c=a+b

return c

end

print(mytable.aa)

print(mytable["bb"])

print(mytable.sum(100,200))

"test08.lua" 18L, 183c written

[root@clintnode testlua]#

[root@clintnode testlua]#

[root@clintnode testlua]#

[root@clintnode testlua]# lua test08.lua

aaaaa

bbbbb

300

[root@clintnode testlua]#

可以看出,在空 table 里添加一个属性,这个值是一个函数,有参数有返回,就把函数所有的功能全部接入到了 table 里面,这就是实现 lua 模块与包的思路。

刚刚写的 test08 里的值是上面定义好 table,定义好 function 类型的 sum,直接可以在脚本里调用了。也就是在同一个脚本里上面调用,下面使用。但通常这些函数都是外部的,那么函数应该如何在外部调用呢?

下面创建 test09,如何在 test09 使用 test08 lua 呢?

图片1.png

试验直接输出是否可以调用:

print(module.sum(100,200))

图片2.png

答案是不可以,因为这里根本没有值,不能读取 mytable。

在写 java 语言的时候,要使用第三方符号的引入,通常使用 import。但是 lua 语法不支持 import,这里要用一个具有类似功能的:require。

test12.lua

require "module"

print(module.index)

print(module.sum(10,20))

module 是要调用的函数所在的脚本名称,这里所要引入的是 test08:

require“test08”

print(module.sum(100,200))

图片3.png

结果如上。有两个300的原因是 test08 做了三个输出,打开 test08 把它注释掉:

图片4.png

图片5.png

然后保存退出。就只有300了。

那么引入第三方或引入其他的包该怎么办?

Require(引入)+使用的函数的脚本名称,脚本名称不需要加“.lua”。

 

三. 总结

1.lua 的 table

1、创建 table: mytable={ip="19216856.111"port=9092}

2)、取值 :mytable.ip

2.lua 的模块

1、lua 的 moudle 其实就是 lua 中的工具类的概念,也类似于 js 中的 jquery这样的包

2)、使用的方式

定义一个模块

自己写一个脚本,如果使用到某一个模块,通过 require 这个关键字引入模块,然后就可以使用模块中的变量和方法。

相关文章
|
存储 Java C语言
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
107 0
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
155 0
|
2月前
|
存储 Java C++
lua完整学习笔记
Lua学习笔记,涵盖了Lua的注释、数据结构、标识符、保留字、变量、运算符、函数、流程控制语句、循环语句、table的使用、迭代器以及模块化等基础知识点。
60 3
lua完整学习笔记
|
4月前
|
Java API C语言
Lua语法(一)
Lua语法(一)
70 0
Lua语法(一)
|
4月前
Lua语法(六)——面相对象编程
Lua语法(六)——面相对象编程
35 0
|
4月前
|
Java
Lua语法(五)——垃圾回收
Lua语法(五)——垃圾回收
111 0
|
4月前
Lua语法(四)——协程
Lua语法(四)——协程
57 0
|
4月前
|
索引
Lua语法(三)——元表与元方法
Lua语法(三)——元表与元方法
49 0
|
4月前
|
缓存
Lua语法(二)——闭包/日期和时间
Lua语法(二)——闭包/日期和时间
92 0
|
6月前
|
存储 缓存 NoSQL
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
84 1