dofile, loadfile, loadstring, require, module
1、函数dofile()和loadfile():
dofile():读入文件编译并执行
loadfile():编译代码成中间码,并返回编译后的chunk作为一个函数 ,而不执行代码,并且不会抛出错误信息,而是返回错误码和nil;
另外,运行一个文件多次的话,loadfile只编译一次,但可多 次运行;dofile每次都要编译;
dofile()本质上位辅助函数,真正实现其功能的是loadfile()
loadstring()函数:
他与loadfile相似,不过他读入的不是chunk,而是从一个串中读入;
运行错误的话,也不会抛出错误,而是返回错误码和nil;
loadstring和loadfile都不会产生边界效应,他们仅仅是编译,而不是定义chunk成为自己内部的一个匿名函数;
lua中函数的定义是发生在运行时的赋值而不是编译;
2、require函数:
require 函数加载一个模块时,实际如下:
在表package.loaded中查找是否存在,有的话就返回该值;
加载Lua文件使用loadfile函数。loadfile会将文件当作函数来加载,require会将模块名作为参数传给该函数。若有返回值则将返回值放入表package.loaded中。若没有则返回表package.loaded中的值。
3、module 函数:
module “mymodule”
==》
local modname = “mymodule” – 定义模块名
local M = {} -- 定义用于返回的模块表
_G[modname] = M -- 将模块表加入到全局变量中
package.loaded[modname] = M -- 将模块表加入到package.loaded中,防止多次加载
setfenv(1,M) -- 将模块表设置为函数的环境表,这使得模块中的所有操作是以在模块表中的,这样定义函数就直接定义在模块表中
------利用loadfile的test.lua文件
#!/usr/bin/lua
F = loadfile("MyPrint.lua")
MyPrint() --在F()前会错误,应该在它之后,因为loadfile只是转换成中间代码,没有执行,用F()来执行之后才可以运行
F()
------MyPrint.lua文件
2 function MyPrint(...)
3 for k, v in pairs(_G) do
4 print("_G", v)
5 end
6 for k, v in pairs(arg) do
7 print("...", v)
8 end
9 end
10
11 if _G.my then
12 print(_G.my)
13 end
14
15 print("load myprint")
16
17 print("1")
--------利用require的test.lua文件
1 #!/usr/bin/lua
2
3 require("MyPrint")
4
5 MyPrint() --由于require相当于直接把另外一个文件的全部东西放进该文件,所以可以执行