lua用法

2.7k 词

从给定的字符串得到块(函数)。lua5.3使用load()替换loadstring().

一般如下用法:
assert(loadstring(script))()
f = loadstring("a = 1")
语义上相当于:
f = loadstring("function() a = 1 end")
复杂用法如下:
下面是动态加载字符串,并执行,结果为一个table

local script = "localee={[0]={id=0,lv=5,text='yy'},[1]={id=1,lv=3,text='zz'}}  return ee"  
local tb=assert(loadstring(script))()  
print(tb[0].text)  

下面是动态加载字符串,并执行,结果为方法

local addscript="function dadd(a,b) return a+b  end"  
assert(loadstring(addscript))()  
print(tostring(dadd(2,3)))  
local f = load("a=1+2")
print(type(f))  --function

loadfile

loadfile 编译Lua外部代码块,但不会运行代码,将会以函数的形式返回编译结果.返回编译结果函数.

local f = laodfile("a.lua")
print(type(f)) --function

dofile

dofile 直接编译运行Lua外部代码块,并不返回任何结果。编译错误会返回nil.

function dofile(filename)
    local func = assert(loadfile(filename))
    func()
end

load

load (chunk [, chunkname [, mode [, env]]])
加载一个代码块。
如果 chunk 是一个字符串,代码块指这个字符串。 如果 chunk 是一个函数, load 不断地调用它获取代码块的片断。 每次对 chunk 的调用都必须返回一个字符串紧紧连接在上次调用的返回串之后。 当返回空串、nil、或是不返回值时,都表示代码块结束。

如果结果函数有上值, env 被设为第一个上值。 若不提供此参数,将全局环境替代它。
chunkname 在错误消息和调试消息中,用于代码块的名字。
字符串 mode 用于控制代码块是文本还是二进制(即预编译代码块)。 它可以是字符串 “b” (只能是二进制代码块), “t” (只能是文本代码块), 或 “bt” (可以是二进制也可以是文本)。 默认值为 “bt”。

_ENV

引用一个叫 var 的自由名字在句法上都被翻译为 _ENV.var 。 此外,每个被编译的 Lua 代码块都会有一个外部的局部变量叫 _ENV。

这里特别指出,你可以定义一个新变量或指定一个参数叫这个名字。 当编译器在转译自由名字时所用到的 _ENV , 指的是你的程序在那个点上可见的那个名为 _ENV 的变量
被 _ENV 用于值的那张表被称为 环境。

Lua保有一个被称为 全局环境 特别环境。它被保存在 C 注册表的一个特别索引下。
在 Lua 中,全局变量 _G 被初始化为这个值。

当 Lua 加载一个代码块,_ENV 这个上值的默认值就是这个全局环境。 因此,在默认情况下,Lua 代码中提及的自由名字都指的全局环境中的相关项 (它们也被称为 全局变量 )。
此外,所有的标准库都被加载入全局环境,一些函数也针对这个环境做操作。 你可以用 load (或 loadfile)加载代码块,并赋予它们不同的环境。 (在 C 里,当你加载一个代码块后,可以通过改变它的第一个上值来改变它的环境。)

select

如果 index 是个数字, 那么返回参数中第 index 个之后的部分; 负的数字会从后向前索引(-1 指最后一个参数)。 否则,index 必须是字符串 “#”, 此时 select 返回参数的个数。

do  
    function foo(...)  
        for i = 1, select('#', ...) do //get the count of the params  
            local arg = select(i, ...);//select the param  
            print("arg", arg);  
        end  
    end  
foo(1, 2, 3, 4);  

end

next

next (table [, index])
允许程序遍历表的所有字段。它的第一个参数是一个表,它的第二个参数是该表的索引。接下来返回表及其关联值的一个索引。

local tee = {1, 3, 4, 6, 8}

t = {3,7,10,17, pi=3.14159, banana="yellow"}
for key,value in next,t,nil do
 print(key,value)
end

function pairs (t)
    return next, t, nil
end

for k, v in pairs(t) do
    print(k, v)
end

pcall

pcall (f [, arg1, ···])

传入参数,以 保护模式 调用函数 f 。 这意味着 f 中的任何错误不会抛出; 取而代之的是,pcall 会将错误捕获到,并返回一个状态码。 第一个返回值是状态码(一个布尔量), 当没有错误时,其为真。 此时,pcall 同样会在状态码后返回所有调用的结果。 在有错误时,pcall 返回 false 加错误消息。

local ret, msg = pcall(function(i) print(i) end, 33)

xpcall

xpcall (f, msgh [, arg1, ···])
这个函数和 pcall 类似。 不过它可以额外设置一个消息处理器 msgh。

local function __TRACKBACK__(errmsg)
    local track_text = debug.traceback(tostring(errmsg), 6);
    print(track_text, "LUA ERROR");
    return false;
end

local function trycall(func, …)
local args = { … };
return xpcall(function() func(unpack(args)) end, TRACKBACK);
end

local function test(aaa)
print("#"…aaa)
end

trycall(test, nil)

多行文本

使用[[ sun feng sunfeng ]] 定义多行文本。