开发者学堂课程【大数据实战项目:反爬虫系统(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.
l
ua" [New] 12L, 123c written
[root
@
clintnode testlua]#
[
root@clintnode testlua]#
[root
@
clintnode testlua]# lua test08.lua
Aaaaa
Bbbbb
1
23
[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.
l
ua
string
string
number
[root@clintnode testlua]#
以上就是 table 的存储数据获取数据。获取还有一种方式:【】加“”,并且其中一个换成角标1:
也就是:
print(mytable.aa)
print(mytable["bb"])
print(mytable[1])
“
test08.
l
ua" 12L, 12
6
c written
[root
@
clintnode testlua]#
[
root@clintnode testlua]#
[root
@
clintnode testlua]# lua test08.lua
a
aaaa
b
bbbb
nil
[root
@clintnode testlua]#
可见角标1没有拿出来,因为没有任何一个索引的名字叫[1],所以这种方法是不可以的。
二. Lua 模块与包
module.lua 文件
module=0
module.index=1
functio
n
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.
l
ua
string
string
number
[root@clintnode testlua]#
数据类型是多种数据类型。那么函数可以吗?
module=0
module.index=1//module
是 table 名称,第一个值是1
functio
n
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 呢?
试验直接输出是否可以调用:
print(module.sum(10
0
,20
0
))
答案是不可以,因为这里根本没有值,不能读取 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(10
0
,20
0
))
结果如上。有两个300的原因是 test08 做了三个输出,打开 test08 把它注释掉:
然后保存退出。就只有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 这个关键字引入模块,然后就可以使用模块中的变量和方法。