• 《Programming in Lua 3》读书笔记(七)


    Compilation,Executioin,and Errors

    Lua的assert函数:assert(v,mess)
    相当于C的断言,当v为nil或者false将触发错误,mess为发生错误时返回的信息

    dofile函数不仅会加载chunk(语句快),并且会运行,而loadfile只会加载chunk,但会将语句快作为一个function返回
    相比较于dofile函数,loadfile函数有返回值,便于我们处理错误,并且适合多次调用,因为可以将loadfile函数的返回值作为一个函数赋值给变量,多次重复调用的时候可以直接调用赋值了的变量。

    load 
    没有到必须要用该函数的时候不要使用这个函数;load也会返回nil值:
    e.g. 
    f = load("i = i + 1")
    f = function () i = i + 1 end

    第二个语句比第一个语句的运行速度更快,因为Lua编译function的时候使用enclosing chunk,而load并没有使用所谓的lexical scoping(词法定界)来编译,load总是在全局环境中编译语句快。
    e.g.
    i = 32
    local i = 0
    f = load("i = i + 1;print(i)")
    g = function () i = i + 1;print(i) end
    f()               -- 33
    g()              -- 1

     
    大多数使用load函数的情况是在加载外部

    加载了一个语句快并不意味着定义了语句快内的函数

    预编译代码能带来更快的加载速度和对代码的保护机制。

    Lua opcode

    error函数
    函数的返回值是个string类型,包含:文件名+代码所在的行+预定义的msg
    eg.
    error("error")               --msg = error
    另外函数可以传递第二个参数,可以控制报告错误所在的位置:书中提到,有的时候不是某个函数出了问题,而是调用该函数的方式或者传递的参数不符合预订要求,此时错误的位置应该是调用的地方而不是定义的地方。参数默认为1,表示报告错误的地方在函数定义
    e.g.
    function foo(str)
         if type(str) ~= "string" then
              error("string expected")
         end
    end
    foo(1)
    此时error函数报告的错误行为 error("string expected") 所在的行

    function foo(str)
         if type(str) ~= "string" then
              error("string expected",2)
         end
    end
    foo(1)
    此时error函数报告的错误行为foo(1) 所在的行;此处error函数的第二个参数为2表示错误报告的地方在调用该函数的地方。


    traceback(回溯),结合xpcall函数使用,debug.debug
  • 相关阅读:
    Python小白学习之路(十)—【函数】【函数返回值】【函数参数】
    Flex布局(一)
    APICloud框架—db数据库模块
    碰到的一些面试问题
    webpack最基本的用法
    基本排序算法
    RequireJS基础知识
    CSS选择器
    把sublime添加到右键快捷菜单
    github的使用与问题
  • 原文地址:https://www.cnblogs.com/zhong-dev/p/4044579.html
Copyright © 2020-2023  润新知