加载函数
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