美文网首页
lua基本函数说明

lua基本函数说明

作者: allanYan | 来源:发表于2016-08-12 17:39 被阅读0次

    lua函数说明

    部分lua函数在lua的dash文档中没找到或者没有使用例子,特记录,备忘;

    getfenv(f)

    1. 功能:

      返回函数f的当前环境表;

    2. 参数:

      f可以为函数或调用栈的级别;当参数为调用栈级别时,1表示当前的函数,0或其他值将返回全局环境表_G

    3. 例子:

      a=1
      for k,v in pairs(getfenv(string.upper)) do
          print(k,v)
      end
      
      

    输出:

    ```lua
    a   1
    string  table: 0xbe12c0
    xpcall  function: 0xbe09c0
    package table: 0xbe1b50
    tostring    function: 0xbe08a0
    print   function: 0xbe0a40
    os  table: 0xbe4140
    unpack  function: 0xbe0960
    require function: 0xbe2340
    getfenv function: 0xbe0430
    setmetatable    function: 0xbe07e0
    next    function: 0xbe0600
    assert  function: 0xbe0310
    tonumber    function: 0xbe0840
    io  table: 0xbe3760
    rawequal    function: 0xbe0aa0
    collectgarbage  function: 0xbe0370
    getmetatable    function: 0xbe06c0
    module  function: 0xbe22e0
    rawset  function: 0xbe0b60
    math    table: 0xbe5570
    debug   table: 0xbe6640
    pcall   function: 0xbe0660
    table   table: 0xbe0bc0
    newproxy    function: 0xbe1560
    type    function: 0xbe0900
    coroutine   table: 0xbe1600
    _G  table: 0xbdf6b0
    select  function: 0xbdf700
    gcinfo  function: 0xbe03d0
    pairs   function: 0xbe00b0
    rawget  function: 0xbe0b00
    loadstring  function: 0xbe05a0
    ipairs  function: 0xbe0010
    _VERSION    Lua 5.1
    dofile  function: 0xbe0480
    setfenv function: 0xbe0780
    load    function: 0xbe0540
    error   function: 0xbe04e0
    loadfile    function: 0xbe0720
    ```
    

    load (chunk [, chunkname [, mode [, env]]])

    1. 功能:
      加载一个块中的函数;

    2. 参数:
      chunk可以是字符串或函数;如果为函数,直到调用结果为空串、nil,将调用结果连接起来做为chunk的内容;mode的可选值包括:

      • b:二进制
      • t:文本
      • bt:二进制或文本[默认值]
    3. 例子:

      function test() 
          return "hello,world"; 
      end
      fn=load(string.dump(test),nil,"b",_ENV)
      print(fn())
      
      

    输出为:hello,world

    loadstring(chunk[,chunkname])

    1. 功能

      同load;

    2. 参数

    chunk为要装载的字符串;

    1. 例子

      local user_script = [[ 
          local a = 0 
          local rand = math.random 
          for i = 1, 200 do 
              a = a + rand(i) 
          end 
          print("hi") 
      ]] 
      
      local f, err = loadstring(user_script, "=user script") 
      
      local env = { 
          math = math, 
          print=print, 
      } 
      setfenv(f, env) 
      
      f()
      

    输出为:hi

    loadfile([filename])

    1. 功能

      同load;

    2. 参数

      参数为文件名;如果不传任何参数,表示从标准输入加载内容;

    3. 例子

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

    1. 功能

      在保护模式下调用函数(即发生的错误将不会抛出异常给调用者)

    2. 参数

      f为函数名称,其他为函数参数;

    3. 例子

    xpcall (f, err_handler [, arg1, ···])

    1. 功能

      与pcall类似,但可指定一个新的错误处理函数句柄,当调用函数成功能返回true,失败时将返回false加err_handler返回的结果;

    2. 参数

      f为函数名,err_handller为发生错误时的回调函数,其他为函数参数;

    3. 例子

      local user_script = [[ 
          local a = 0 
          local rand = math.random 
          for i = 1, 200 do 
              a = a + rand(i) 
          end 
          print("hi") 
      ]] 
      
      local function handle_timeout(typ) 
          return error("user script too hot") 
      end 
      
      local function handle_error(err) 
          return string.format("%s: %s", err or "", debug.traceback()) 
      end 
      
      -- 为了让debug.sethook正常工作,必须关闭JIT: 
      user_script = [[jit.off(true, true) ]] .. user_script 
      
      local f, err = loadstring(user_script, "=user script") 
      if not f then 
          ngx.say("ERROR: failed to load user script: ", err) 
          return 
      end 
      
      -- 只允许math.*和print函数可以调用 
      local env = { 
          math = math, 
          print = print, 
          jit = { off = jit.off }, 
      } 
      setfenv(f, env) 
      
      --调用的指令不能超过1000,否则触发handle_timeout函数
      --debug.sethook的第二个参数还可以传入c,r和l
      --c表示调用函数时触发hook
      --r表示函数返回时触发hook
      --l表示执行新的一行代码触发hook
      local instruction_limit = 1000 
      debug.sethook(handle_timeout, "", instruction_limit) 
      local ok, err = xpcall(f, handle_error) 
      if not ok then 
          print("failed to run user script: ", err) 
      end 
      debug.sethook()  -- turn off the hooks
      

      输出:

      failed to run user script:  user script:5: user script too hot: stack traceback:
      1.lua:15: in function <1.lua:14>
      [C]: in function '__add'
      user script:5: in main chunk
      [C]: in function 'xpcall'
      1.lua:37: in main chunk
      [C]: at 0x010d5c6ec0
      

    相关文章

      网友评论

          本文标题:lua基本函数说明

          本文链接:https://www.haomeiwen.com/subject/hxresttx.html