0. 导入
lua基础一本通 第二章:迭代器与模块
1. 迭代器
Lua 提供了两个迭代器,这两个迭代器通常会应用于泛型for循环中,用于遍历指定的table:
pairs(table):会迭代整个table元素,无论是数组元素,还是key-value,先遍历数组,后输出key-value,但是内部不保证顺序。ipairs(table):仅会迭代指定table 中的数组元素,遇到nil停止。
示例:
emp = {"bj", name = "sz", 23, 56, "sh", nil, "gz"}
for index, value in ipairs(emp) do
io.write(value .. " ")
end
print()
for key, value in pairs(emp) do
io.write(emp[key] .. " ")
end
输出:
bj 23 56 sh
bj 23 56 sh gz sz
2. 模块
模块是Lua中特有的一种数据结构。
从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
模块文件主要由table组成。在table中添加相应的变量、函数,最后文件返回该table即可。如果其它文件中需要使用该模块,通过require将该模块导入。
导入为 require 关键字,将指定的lua文件静态导入(合并为一个文件)。require()函数是有返回值的,返回的就是模块文件最后return的table。可使用一个变量接收该table值作为模块的别名,就可以使用别名来访问模块了;即使赋值,也可用原来的模块本身的名字:
require "rectangle"
-- or
rect = require "rectangle"
rectangle.lua
rectangle = {}
rectangle.pai = 3.14
function rectangle.perimeter(a, b)
return (a + b) * 2
end
function rectangle.area(a, b)
return a * b
end
-- 下面是一些全局变量/函数的定义,不建议这么玩
a = 123
local function area_b(r)
return r * r * rectangle.pai
end
function fuc1(r)
print("==== " .. area_b(r) .. " ====")
end
return rectangle
test.lua
rect = require "rectangle"
print(rect.pai)
print(rect.perimeter(2, 3))
print(rectangle.area(2, 3)) -- 两种写法都可以
print(a)
fuc1(1)
输出:
3.14
10
6
123
==== 3.14 ====

2087

被折叠的 条评论
为什么被折叠?



