1.dofile与loadfile

dofile当作Lua运行代码的chunk的一种原始的操作。dofile实际上是一个辅助的函数。真正完成功能的函数是loadfile;与dofile不同的是loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码;另外loadfile不会抛出错误信息而是返回错误代。我们可以这样定义dofile:

function dofile (filename)
local f = assert(loadfile(filename))
return f()
end

如果loadfile失败assert会抛出错误。loadfile更加灵活。在发生错误的情况下,loadfile返回nil和错误信息,这样我们就可以自定义错误处理。另外,如果我们运行一个文件多次的话,loadfile只需要编译一次,但可多次运行。dofile却每次都要编译。
2.loadstring与loadfile
loadstring与loadfile相似,只不过它不是从文件里读入chunk,而是从一个串中读入。
f = loadstring("i = i + 1")
loadstring函数功能强大,但使用时需多加小心。确认没有其它简单的解决问题的方法再使用。loadfile和loadstring都不会抛出错误,如果发生错误他们将返回nil加上错误信息。另外,loadfile和loadstring都不会有边界效应产生,他们仅仅编译chunk成为自己内部实现的一个匿名函数。通常对他们的误解是他们定义了函数。Lua中的函数定义是发生在运行时的赋值而不是发生在编译时。
loadstring通常用于运行程序外部的代码,比如运行用户自定义的代码。注意:loadstring期望一个chunk,即语句。如果想要加载表达式,需要在表达式前加return,那样将返回表达式的值。loadstring返回的函数和普通函数一样,可以多次被调用。
print "enter your expression:"
local l = io.read()
local func = assert(loadstring("return " .. l))
print("the value of your expression is " .. func())

3.require与dofile
。粗略的说require和dofile完成同样的功能但有两点不同:
1. require会搜索目录加载文件
2. require会判断是否文件已经加载避免重复加载同一文件。由于上述特征,require在Lua中是加载库的更好的函数。

require使用的路径和普通我们看到的路径还有些区别,我们一般见到的路径都是一个目录列表。require的路径是一个模式列表,每一个模式指明一种由虚文件名(require的参数)转成实文件名的方法。更明确地说,每一个模式是一个包含可选的问号的文件名。匹配的时候Lua会首先将问号用虚文件名替换,然后看是否有这样的文件存在。如果不存在继续用同样的方法用第二个模式匹配。例如,路径如下:?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua 
调用过程如下:
lili
lili.lua
c:\windows\lili
/usr/local/lua/lili/lili.lua

还会有so/dll文件。
为了确定路径,Lua首先检查全局变量LUA_PATH是否为一个字符串,如果是则认为这个串就是路径;否则require检查环境变量LUA_PATH的值,如果两个都失败require使用固定的路径(典型的"?;?.lua")
一个路径中的模式也可以不包含问号而只是一个固定的路径,比如:?;?.lua;/usr/local/default.lua。这种情况下,require没有匹配的时候就会使用这个固定的文件(当然这个固定的路径必须放在模式列表的最后才有意义)

lua require dofile loadfile区别相关推荐

  1. Lua中的loadfile、dofile、require详解

    这篇文章主要介绍了Lua中的loadfile.dofile.require详解,本文分别用实例讲解它的用法和特点等内容,需要的朋友可以参考下 本来今天不应该讨论这几个函数的,不过,为了凑字数..不,为 ...

  2. android lua loadluafile 相对路径,Lua中的loadfile、dofile、require详解

    1.loadfile--只编译,不运行java loadfile故名思议,它只会加载文件,编译代码,不会运行文件里的代码. 好比,咱们有一个hellofile.lua文件:函数 复制代码代码以下: p ...

  3. 扩展 lua require 的行为

    扩展 lua require 的行为 来源 https://blog.codingnow.com/2015/10/lua_require_env.html 今天同事提了个需求,他希望可以给部分 lua ...

  4. Ruby中的require_relative和require有什么区别?

    本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...

  5. require与include+php,PHP中include与require有什么区别

    PHP中include与require有什么区别 发布时间:2021-01-13 15:24:31 来源:亿速云 阅读:81 作者:Leah PHP中include与require有什么区别?相信很多 ...

  6. Lua require 相对路径

    lua require 加载方式与我们现在熟知的路径系统不太一样,想要知道lua require 方法的工作原理也很简单 随便写一个错误的require 代码即可: 1 require("l ...

  7. require.ensure与require AMD的区别

    转载自  webpack: require.ensure与require AMD的区别 webpack: require.ensure与require AMD的区别 简介 require-ensure ...

  8. 【PHP】PHP include()和require()方法的区别

    PHP的include()和require()是两种包含外部文件的方法,对于这两种方法有什么区别,很多初学者可能不是很明白.下面总结一下PHP include()和require()的区别: 1:加载 ...

  9. lua/require函数

    Lua提供高级的require函数来加载运行库,lua中的require函数功能主要有: 1.require函数会搜索目录加载文件 2.require会判断是否文件已经加载避免重复加载同一文件. 由于 ...

最新文章

  1. 网络推广外包浅析当下网站优化处于健康状态有利于网络推广外包
  2. 重叠IO模型-异步IO
  3. 台式电脑麦克风_还有人买台式PC吗?这份新品推荐攻略值得收藏
  4. 潜水员(信息学奥赛一本通-T1271)
  5. git pull rebase
  6. plsq卸载 删除注册表、_别再用老方法卸载电脑软件了,只会让电脑越来越慢
  7. 企业如何挖掘知识“金矿”?这本白皮书讲得够透彻
  8. 引入react文件报错_React Native常见问题(一)
  9. 项目进度计划检查方法与项目进度管理相关模版表单(干货+资料)
  10. CAD弹窗拦截器/CAD字体自动替换工具
  11. 业务需求分析师Business Analysist(BA)的职业发展之路
  12. 阿里 离线数据同步工具 DataX 初试
  13. 产品读书《穷查理宝典:查理.芒格智慧箴言录》
  14. 关于小米路由器设置无线中继失败的问题
  15. CAD2011启动死机,响应很慢
  16. html怎么快捷审查源代码,怎样查看网页源代码和审查元素?
  17. 【315】备份全盘和备份C盘的区别
  18. 数组截取方法-Arrays.copyOfRange()详解
  19. baq在聊天中啥意思,Epicor 10在BPM工作流设计器中链接BAQ(避免自定义代码)
  20. 我的HarmonyOS实战 — 一篇文章讲明白什么是鸿蒙2.0服务卡片

热门文章

  1. flex布局知识点总结
  2. 尝试去读SQLMAP源码(一)
  3. installshield学习笔记
  4. FineUI第七天---文件上传
  5. Java对存储过程的调用方法
  6. 数据结构——折半查找
  7. 在Eclipse中写第一个hibernate小例子
  8. 怎么卸载Apache_pn服务-PHPnow使用问题
  9. 声腔设计中无前腔的影响
  10. linux和android开发链接