加载函数

Lua把chunk(Lua把加载的一份外部代码也看作一个chunk)当作匿名函数处理,例如”a=1”.loadstring返回与其等价的function() a = 1 end。
loadfile只是在编译chunk成为自己内部实现的一个匿名函数。

dofile会编译并执行,loadfile只编译代码生成中间码并且返回编译后的chunk作为一个函数,但不执行代码。
如果要运行一个文件多次,loadfile只需要编译一次,但可以运行多次,dofile每次都需要编译。

require形式上很类似C++ 语言的#include<>,在其他地方定义的函数,经这么引入之后就可以调用了,不过Lua不是定义和实现分离的语言,这样是把整个定义部分都加载进来了,加载过程大致上是:Lua先加载这个外部文件,然后运行它。实际上这段外部代码是有返回值的,它的返回值,就是require的返回值。

require、dofile、loadfile区别

以加载luafila.lua为例
luafile.lua

print("hello")
sayHi = function()
    print("Hi")
end

require 只加载并执行代码一次(不会重复加载)

for i=1,3,1 do
    require("luafile")
end
print("end")

-- result print:
-- hello
-- end

dofile 加载并执行代码

for i=1,3,1 do
    dofile("luafile.lua")
end
print("end")

-- result print:
-- hello
-- hello
-- hello
-- end

loadfile加载但不执行代码

loadfile("loadfiletest.lua")
print("end")

-- result print:
-- end

require 返回值

require的返回值就是外部代码的返回值。如果外部代码没有返回值,require默认加载成功后返回ture

require 返回ture

luafile1.lua

t = {}
t.value = 100;
t.sayHi = function()
    print("Hi")
end
t.table = { introduce = "I am a table"}
//没有return语句
t1 = require "luafile1"
print(t.value)          -- result : 100
print(t1)           -- result : true  没有return语句且加载成功require返回true

require 返回函数

luafile2.lua

t = {}
t.value = 100;
t.sayHi = function()
    print("Hi")
end
t.table = { introduce = "I am a table"}
//新增return语句返回一个函数
return t.sayHi
t1 = require "luafile2"
print(t.value)          -- result : 100
print(t1)           -- result : function: 00BABCE8  返回外部代码return的函数
t1()                -- result : Hi

require 返回table

luafile3.lua

t = {}
t.value = 100;
t.sayHi = function()
    print("Hi")
end
t.table = { introduce = "I am a table"}
return t
t1 = require "luafile3"
print(t)                -- result : table: 00C696C8
print(t1)               -- result : table: 00C696C8
for k,v in pairs(t) do                  -- result : value   100
    print(k , v)                --      sayHi   function: 00C6B988
end                 --      table   table: 00C696A0

loadfile 返回值

loadfile只编译代码生成中间码并且返回编译后的chunk作为一个函数,但不执行代码
luafil.lua

print("hello")
sayHi = function()
    print("Hi")
end
-- 相当于将匿名函数
-- function()   
--  print("hello")
--  sayHi = function()
--      print("Hi")
--  end
-- end
-- 引用赋值给f
f = loadfile("loadfiletest.lua")                                
f()  
print("end")

-- result print:
-- hello
-- end

dofile 返回值

dofile类似require,也是返回外部代码的返回值。区别是如果外部代码没有返回值,则返回nil,也就是说无返回值

模块

在Lua中要声明全局变量非常简单,就是定义变量的时候,不要加上local,这个神秘的全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了,而这个table名为_G.
我们在外部文件中定义的函数、表、字符串等值,实际上在加载时全部都被加到全局环境下。不过全局的东西用起来要小心,有一个原则是对全局的“污染”越小越好。那么自然就引入了“模块”的概念。在Lua中,模块是由万能的table充当的,最自然的想法就是定义一个table,然后把要定义的函数放在这个table中,最后返回这个table就行了。
比如对一个luafile.lua文件,加载它就为_G全局表新增了mood、sayHi、t字段
luafile.lua

t = { value = 100 }
sayHi = function()
    print("Hi")
end
mood = "Happy"
t1 = require "luafile"
print(mood)             -- Happy
print(_G["mood"])       -- Happy
print(sayHi)            -- function: 00C2BD08
_G["sayHi"]()           -- Hi
print(_G["t"].value)    -- 100

以模块的方式加载

t = { value = 100 }
t.sayHi = function()
    print("Hi")
end
t.mood = "Happy"
return t

_G表就只新增字段t,且我们可以通过该表获取所有字段值。

参考:
www.jb51.net/article/55125.htm