• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua中require,dofile,loadfile,dostring,loadstring,loadlib,load之间的区别

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Lua 是一种解释型语言,可以执行动态生成代码,正是因为存在dofile这样的函数;然而dofile 只是一个辅助函数,loadFile 才做了核心工作。LoadFile 会加载一段代码,只编译不执行,并把结果作为一个函数返回,可以多次调用;然而dofile是加载并执行,会造成多次开销,LoadFile 由于只编译一次,所以 开销却很少。

说完了LoadFile 和DoFile 后,我们来谈一下 require ;require这个函数有意思了。我们require 通常是一个模块,比如Lua 文件或者C文件,并作为一个table 返回。下面我们来具体分析一些 require 都做了些什么。

先上一段代码:

function require(name)

if not package.loaded[name] then

  local loader = findloader(name)

  if loader == nil then

    error("没找到 模块")

  end

  package.loaded[name] = true;

  local res = loader(name)

  if res ~= nil then

    package.loaded[name] = res;

  end

end

return  package.loaded[name]

end

上完代码后,我不过多解释,大概都可以看明白吧。

package.loaded 中检查是否已加载,如果没有就创建加载器,如果有就直接返回,

如果要强制require 某个模块2次的话,需要将package.laoded[name] = nil;

require 进来后,并不执行。如果require 的是C文件,就需要package.loadlib 去加载。

说一些loadstring :loadstring 用法和loadfile类似,但是性能开销很大,loadstring 是加载字符串,并把函数作为一个值返回 比如:

f = loadstring("i = i + 1")

f();

如果有出错 就用 assert(f)() 输出log;

每次调用loadstring都会被编译,而且是全局编译

i = 32;

local i = 0;

f = loadstring("i = i+1; print(1)");

g = function() i = i+1;print(i) end

f(); ---->33

g(); -->1

loadfile 和loadstring 其实都是调用lua中原始函数load,load 加载程序块可以分多次返回一个程序块,知道返回nil为止,或者程序块过大无法放入内存中才用到它


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua_lua与.Net互相调用发布时间:2022-07-22
下一篇:
nginxluamysqlredis设置发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap