dofile, loadfile, loadstring, require, module

来源:互联网 发布:数据库字段注释 编辑:程序博客网 时间:2024/04/30 17:14

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相当于直接把另外一个文件的全部东西放进该文件,所以可以执行