Lua Require函数

转自:http://www.cppblog.com/cslover/archive/2013/12/21/204934.html

Lua提供高级的require函数来加载运行库。粗略的说require和dofile完成同样的功能但有两点不同:

1. require会搜索目录加载文件

2. require会判断是否文件已经加载避免重复加载同一文件。由于上述特征,require在Lua中是加载库的更好的函数。

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

?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua

调用require "lili"时会试着打开这些文件:

lili

lili.lua

c:\windows\lili

/usr/local/lua/lili/lili.lua

require关注的问题只有分号(模式之间的分隔符)和问号,其他的信息(目录分隔符,文件扩展名)在路径中定义。

为了确定路径,Lua首先检查全局变量LUA_PATH是否为一个字符串,如果是则认为这个串就是路径;否则require检查环境变量LUA_PATH的值,如果两个都失败
      require使用固定的路径(典型的"?;?.lua")

require的另一个功能是避免重复加载同一个文件两次。Lua保留一张所有已经加载的文件的列表(使用table保存)。如果一个加载的文件在表中存在require简单的返回;
      表中保留加载的文件的虚名,而不是实文件名。所以如果你使用不同的虚文件名require同一个文件两次,将会加载两次该文件。比如require "foo"和require "foo.lua",
 路径为"?;?.lua"将会加载foo.lua两次。我们也可以通过全局变量_LOADED访问文件名列表,这样我们就可以判断文件是否被加载过;同样我们也可以使用一点小技巧让
require加载一个文件两次。比如,require "foo"之后_LOADED["foo"]将不为nil,我们可以将其赋值为nil,require "foo.lua"将会再次加载该文件。

一个路径中的模式也可以不包含问号而只是一个固定的路径,比如:

?;?.lua;/usr/local/default.lua

这种情况下,require没有匹配的时候就会使用这个固定的文件(当然这个固定的路径必须放在模式列表的最后才有意义)。在require运行一个chunk以前,它定义了
一个全局变量_REQUIREDNAME用来保存被required的虚文件的文件名。我们可以通过使用这个技巧扩展require的功能。举个极端的例子,我们可以把路径设为
"/usr/local/lua/newrequire.lua",这样以后每次调用require都会运行newrequire.lua,这种情况下可以通过使用_REQUIREDNAME的值去实际加载required的文件。

时间: 2024-10-13 04:27:39

Lua Require函数的相关文章

lua require与module

一.模块机制module 1.什么是module 对于用户来说,一个module相当于一个so库.模块的主要目标是实现代码的共享. 2.如何编写module lua是通过table来实现模块的,典型的写法如下. local M = {}        ---- 通常是加local的,如果不加,则M默认注册到_G中,require后,即使不return也可以直接使用M.加了local是局部变量,需要显示的return一下. M.print = function(...) print(...) en

Chapter 15_1 require函数

Lua提供了一个名为require的高层函数来加载模块,但这个函数只假设了关于模块的基本概念. 对于require而言,一个模块就是一段定义了一些值(函数或者包含函数的table)的代码. 为了加载一个模块,只需要简单调用require "modname" .这个函数首先会查找package.loaded表,检查modname是否加载过. 如果加载过,require返回package.loaded[modname]中的值. 否则,它试着为模块寻找“加载器”. 首先require会搜寻L

luci 中require函数包含的路径

在 lua 脚本中常用的包含某个文件就是 require 函数. 例如: #!/usr/bin/lua                     // 表明使用的是lua脚本,像shell脚本一样 local http = require("socket.http") local json = require("luci.json") 有时候会遇到需要的文件查找不到的现象.例如: /usr/bin/lua: /usr/sbin/test:4: module 'luci

lua闭合函数

function count( ... ) local i = 0 return function( ... ) i = i+ 1 return i end end local func = count(...) print(func()) print(func()) print(func()) 结果如下: 1 2 3 [Finished in 0.1s] lua 闭合函数:一个函数加上该函数所需访问的所有“非局部变量”. 如上所示:count()函数返回了另一个函数,而这个函数使用了count

Lua程序设计 函数 正确的尾调用

Lua中的"尾调用"就是一种类似于goto的函数调用,当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条"尾调用".[一个函数在调用完另一个函数之后,是否就无其他事情需要做了] function f(x) return g(x) end   也就是说,当f调用完g之后,f所代表的整个函数的调用才算执行完成也就无其他事情可做了.因此,这种情况中,程序就不需要返回那个"尾调用"所在的函数了. 所以在"尾调用"之后,程序也

lua的函数初识

学习到Lua的函数,觉得有必要记下来. 参考教程:Programming in Lua 函数可以以表达式或陈述语句出现,如下所示: print(8*9, 9/8) a = math.sin(3) + math.cos(10) 书写函数时有个小规则,如果函数只有一个参数,或者是一串字符,或者是一个表结构时,括号可以省略: print "Hello World" <--> print("Hello World") dofile 'a.lua' <--&

lua require

aa.lua function showName( var ) print ("woshi dongshen "..var) end 1.lua require("aa") showName("ok")

通过Include和Require函数实现代码重用

通过Include和Require函数实现代码重用     如果你做过各种大小的Web站点,一定会对重用代码段的重要性深有体会,不管是HTML还是PHP代码块.比如需要一年修改一次包含版权信息的页脚,而你有1000个Web页(就算是10个),手动操作则会让你痛苦不已. 通过PHP,你可以使用不同函数帮助你重用代码.具体用到的函数取决于你打算重用的内容. 主函数如下: include() and include_once() require() and require_once() include

VC和LUA混合开发之VC程序调用Lua脚本函数

http://www.cnblogs.com/clever101/archive/2010/04/14/1712207.html 作者:朱金灿 来源:http://www.cnblogs.com/clever101/ Lua语言以其卓越的可扩展性.简单.高效率和与平台无关性在游戏领域得到广泛应用.今天花了一些时间学习VC和Lua如何混合开发,编写了一个小例程,和大家分享一下这方面的经验. 首先在http://www.lua.org/ftp/下载Lua的最新版本:lua-5.1.4.然后用VS C