Lua 加载函数require dofile loadfile

来源:互联网 发布:浪潮软件集团招聘 编辑:程序博客网 时间:2024/05/21 15:50

加载函数

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")endprint("end")-- result print:-- hello-- end

dofile 加载并执行代码

for i=1,3,1 do    dofile("luafile.lua")endprint("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")endt.table = { introduce = "I am a table"}//没有return语句
t1 = require "luafile1"print(t.value)          -- result : 100print(t1)           -- result : true  没有return语句且加载成功require返回true

require 返回函数

luafile2.lua

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

require 返回table

luafile3.lua

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

loadfile 返回值

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

print("hello")sayHi = function()    print("Hi")end
-- 相当于将匿名函数-- function()   --  print("hello")--  sayHi = function()--      print("Hi")--  end-- end-- 引用赋值给ff = 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")endmood = "Happy"
t1 = require "luafile"print(mood)             -- Happyprint(_G["mood"])       -- Happyprint(sayHi)            -- function: 00C2BD08_G["sayHi"]()           -- Hiprint(_G["t"].value)    -- 100

以模块的方式加载

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

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

参考:
www.cnblogs.com/yyxt/p/3870236.html
www.jb51.net/article/55125.htm
www.cnblogs.com/sifenkesi/p/3757282.html