Compilation, Execution, and Errors
前面我们介绍过dofile函数, 其实dofile的实现如下:
function dofile (filename)
local f = assert(loadfile(filename))
return f()
end
loadfile函数很灵活, 我们可以多次调用loadfile的返回结果来反复执行一段代码. 但是如果出错loadfile将返回nil和一个错误提示信息.
loadstring功能和loadfile类似, 参数为要直接处理的script内容.
f = loadstring("i = i + 1")
i = 0
f(); print(i) --> 1
f(); print(i) --> 2
loadstring载入后相当于多了一个匿名函数定义,
-- file `foo.lua'
function foo (x)
print(x)
end
f = loadfile("foo.lua")
f() -- defines `foo'
foo("ok") --> ok
你也可以使用loadstring(s)()达到同样的效果.
使用loadstring时所用的变量都位于全局空间:
local i = 0
f = loadstring("i = i + 1") -- global i
g = function () i = i + 1 end --local i
The require Function
Lua提供了一个函数require用来载入库. require作的工作有些像dofile但有两点重要不同:require会在path指定的路径搜索文件, 而且require可以知道一个文件是否已被执行, 如果已被执行过, 那么不会再次被执行.
Lua使用的path和许多平台使用的标准path有些不同, 许多平台使用的path是一系列含有目标文件的文件夹,但是Lua不一样. Lua使用的ANSI C语言并没有path这样的概念, 因此Lua使用的是字符串匹配的方式. '?'代表文件名, 以';'隔开.
?;?.lua;c:/windows/?;/usr/local/lua/?/?.lua
如果调用 require 'lili', 那么会尝试打开下列文件:
lili
lili.lua
c:/windows/lili
/usr/local/lua/lili/lili.lua
require会首先检查全局变量LUA_PATH, 如果LUA_PATH是一个字符串类型, 那么使用它的值. 否则检查环境变量LUA_PATH, 如果以上值都不存在, 那么使用一个定值, 这个值可以在编译LUA的时候方便的加以改变.
另一个require的主要功能是避免一个文件被执行多次. 为了实现这个目的, 它保存了一个table用来记录所有已经载入的文件. 注意, 这里的key值并不是真实的文件名而是一个虚拟文件名. 所以
require "foo"
require "foo.lua"
path是"?;?.lua", 那么foo.lua会被载入两次. 可以通过全局变量 _LOADED 访问到这个表的值.
path中可以含有固定文件的值, 例如:
?;?.lua;/usr/local/default.lua
在这种情况下, 如果 reqire 不能找到其他的匹配, 那么就使用/usr/local/default.lua.
Compilation, Execution, and Errors
前面我们介绍过dofile函数, 其实dofile的实现如下:
function dofile (filename)
local f = assert(loadfile(filename))
return f()
end
loadfile函数很灵活, 我们可以多次调用loadfile的返回结果来反复执行一段代码. 但是如果出错loadfile将返回nil和一个错误提示信息.
loadstring功能和loadfile类似, 参数为要直接处理的script内容.
f = loadstring("i = i + 1")
i = 0
f(); print(i) --> 1
f(); print(i) --> 2
loadstring载入后相当于多了一个匿名函数定义,
-- file `foo.lua'
function foo (x)
print(x)
end
f = loadfile("foo.lua")
f() -- defines `foo'
foo("ok") --> ok
你也可以使用loadstring(s)()达到同样的效果.
使用loadstring时所用的变量都位于全局空间:
local i = 0
f = loadstring("i = i + 1") -- global i
g = function () i = i + 1 end --local i
The require Function
Lua提供了一个函数require用来载入库. require作的工作有些像dofile但有两点重要不同:require会在path指定的路径搜索文件, 而且require可以知道一个文件是否已被执行, 如果已被执行过, 那么不会再次被执行.
Lua使用的path和许多平台使用的标准path有些不同, 许多平台使用的path是一系列含有目标文件的文件夹,但是Lua不一样. Lua使用的ANSI C语言并没有path这样的概念, 因此Lua使用的是字符串匹配的方式. '?'代表文件名, 以';'隔开.
?;?.lua;c:/windows/?;/usr/local/lua/?/?.lua
如果调用 require 'lili', 那么会尝试打开下列文件:
lili
lili.lua
c:/windows/lili
/usr/local/lua/lili/lili.lua
require会首先检查全局变量LUA_PATH, 如果LUA_PATH是一个字符串类型, 那么使用它的值. 否则检查环境变量LUA_PATH, 如果以上值都不存在, 那么使用一个定值, 这个值可以在编译LUA的时候方便的加以改变.
另一个require的主要功能是避免一个文件被执行多次. 为了实现这个目的, 它保存了一个table用来记录所有已经载入的文件. 注意, 这里的key值并不是真实的文件名而是一个虚拟文件名. 所以
require "foo"
require "foo.lua"
path是"?;?.lua", 那么foo.lua会被载入两次. 可以通过全局变量 _LOADED 访问到这个表的值.
path中可以含有固定文件的值, 例如:
?;?.lua;/usr/local/default.lua
在这种情况下, 如果 reqire 不能找到其他的匹配, 那么就使用/usr/local/default.lua.
分享到:
相关推荐
lua学习笔记
lua学习资料lua学习资料lua学习资料lua学习资料
自己学习lua记得笔记,做任务用的~很基础的东西,想要的拿走,免费
lua (vc环境)学习笔记(学习代码) lua (vc环境)学习笔记(学习代码) lua (vc环境)学习笔记(学习代码)
学习笔记,lua学习基础笔记,小知识点,下载嘘谨慎,没有想象中完美
在Lua中,表达式包括:数值常量、字符串字面值、变量、单目和双目运算符,函数调用,也包括一些非传统的函数定义和表结构。今天我们就来详细了解下lua中的表达式
主要介绍了Lua学习笔记之函数、变长参数、closure(闭包)、select等,本文着重讲解了这些特性的用法,并给出代码实例,需要的朋友可以参考下
有其他语言基础学习lua入门是比较快的,主要是学习lua跟其他语言的一些区别,一些特性
今天看见技术群里不少人在谈论Lua脚本语言,于是我有个想法学习Lua! 刚开始呢,什么也不懂。搜了下相关文章,供大家共同学习参考!
Lua学习入门教程。适合初级入门者使用。
Lua 5.1 manual 笔记,由FinixLei整理,中文版。
Lua的table元表自我学习笔记分享。--lua元表总结 --1、__index的运用 (调用table的一个不存在的索引时,会使用到元表的__index元方法,搜索元表是否也有改索引,__index可以是一个函数也可是一个table。)
本文详细的总结了Lua中的类型与值,对于实际编程中容易出错的地方也进行了详细的总结,十分的全面实用。有需要的小伙伴可以参考下。
lua 使用笔记资源描述可以把电子书的概述、源代码的说明、
该笔记纯属我个人在实际开发中积累的,非网上直接复制粘贴,其中包括一些隐蔽bug解决方案,希望对相关游戏开发人员有所帮助。
在Android项目中使用Lua,需要两个步骤: 1、加载Lua脚本解析引擎。 2、以Native API方式调用引擎接口 直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )...
lua 学习
整理了之前使用lua capi时不足的地方