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 这个关键字引入模块,然后就可以使用模块中的变量和方法。

相关文章
|
6月前
|
存储 Java C语言
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
48 0
|
8月前
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
87 0
Lua 基本语法
Lua语言的关键字包括and, break, do, else等,下划线开头的大写变量如&_VERSION是内部使用的。全局变量默认自动创建,无需声明,赋值后即存在,如`b=10`。访问未初始化的全局变量返回nil。删除全局变量通过赋值为nil,如`b=nil`,之后变量b被视为不存在。
|
15天前
Lua 基本语法
Lua语言的关键字包括and, break, do, else等,下划线开头的大写变量如&_VERSION是内部使用的。全局变量默认无需声明,赋值后自动创建,如`b=10`。访问未初始化的全局变量返回nil。删除全局变量通过赋值为nil,如`b=nil`,之后b不存在。
|
15天前
Lua 基本语法
`Lua`中,-- 开始是单行注释,[[...]]包裹的是多行注释。标示符以字母或_开头,跟零或多字母、_、数字。避免_大写字母组合,因它们可能是保留字。Lua区分大小写,如`mohd`, `zara`, `move_name`, `_temp`都是合法标示符。
|
16天前
|
存储
Lua 基本语法
Lua 是一种脚本语言,程序可保存在 `.lua` 文件中执行。例如,`hello.lua` 包含 `print` 语句打印 "Hello World!" 和 "www.baidu.com"。通过 `lua hello.lua` 运行脚本。此外,可使用shebang (`#!/usr/local/bin/lua`) 指定 Lua 解释器,赋予脚本执行权限后,直接运行 `./hello.lua`。
|
16天前
|
Shell
Lua 基本语法
`Lua`入门简单,首程序常通过交互式模式在命令行运行。启动`lua -i`进入环境,如: ```sh $ lua -i > print("Hello World!") ``` 显示: ``` Hello World! ``` 这是快速体验`Lua`的一个方式。
|
1月前
|
NoSQL JavaScript Java
Lua开发环境搭建和基础语法
Lua开发环境搭建和基础语法
|
2月前
|
Java Kotlin 索引
Lua 起航 —— 一些常用基础语法
Lua 起航 —— 一些常用基础语法
39 1
|
7月前
|
存储 Java 应用服务中间件
Lua语法讲解
Lua语法讲解
50 0