《LUA程序设计(第2版)》的原文摘录

  • lua_call 函数完成一次无保护的调用,它类似于 lua_pcall,不过在发生错误时,它会传播错误,而非返回错误代码。在一个应用程序中编写主函数时,不应使用lua_call,因为这样需要捕获所有的错误。而编写C函数时,通常可以用lua_call。若有错误发生,只需将错误留下。 当一个 C 函数从 Lua 收到一个字符串参数时,必须遵守两条规则:不要在访问字符串时从栈中弹出它,不要修改字符串。 当一个 C 函数需要创建一个字符串返回给 Lua 时,C 代码还必须处理字符串缓冲的分配的释放、缓冲溢出等问题。 (查看原文)
    [已注销] 1赞 2012-05-22 10:39:20
    —— 引自第234页
  • 这个函数有点类似于 C 函数 sprintf,但是无须提供这个新字符串的缓冲。Lua 会动态地创建一个足够大的缓冲来存放字符串,确保不会有缓冲溢出等问题。这个函数会将结果字符串压入栈中,并返回一个指向它的指针。当前,这个函数接受的指示符只有:%%(字符%)、%s(字符串)、%d(整数)、%f(Lua 中的数字,即双精度浮点数)以及%c(接受一个整数,并将其格式化为一个字符)。除此之外,它不接受任何例如宽度或精度选项 (查看原文)
    [已注销] 1赞 2012-05-22 10:39:20
    —— 引自第234页
  • 通过这些函数,就无须再关心缓冲的分配、溢出等细节了。此外,这种连接算法也非常高效。 (查看原文)
    [已注销] 1赞 2012-05-22 10:39:20
    —— 引自第234页
  • 在调用setDefault后,任何对tab中存在字段的访问都将调用它的__index元方法,而这个元方法会返回0(这个元方法中d的值). (查看原文)
    WingStone 3回复 1赞 2012-05-30 22:24:46
    —— 引自第120页
  • After the call to setDefault, any access to an absent eld in tab calls its __index metamethod, which returns zero (the value of d for this metamethod). (查看原文)
    WingStone 3回复 1赞 2012-05-30 22:24:46
    —— 引自第120页
  • local function iter(a, i) i = i + 1 local v = a[i] if v then return i, v end end function ipairs(a) return iter, a, 0 end </代码结束> (查看原文)
    松鼠亲自奥利奥 1赞 2013-01-01 21:48:56
    —— 引自第55页
  • 在Lua中,函数是一种“第一类值”,它们具有特定的词法域。 第一类值是什么意思呢?就是说在Lua中函数与其他传统类型的值有着相同的权利。函数可以存储到变量中,也可以作为实参传给其他函数,还可以作为函数的返回值。 (查看原文)
    月出渐分明 2013-01-16 22:01:40
    —— 引自第45页
  • 一个函数定义就是一个语句(准确地说是一个赋值语句),这种语句创造了一种类型为函数的值 (查看原文)
    月出渐分明 2013-01-16 22:01:40
    —— 引自第45页
  • Such constructors can be as large as you need (well, up to a few million ele- ments). (查看原文)
    Grissiom 2011-05-18 22:59:19
    —— 引自第117页
  • If this format reminds you of BibTeX, it is not a coincidence. BibTeX was one of the inspirations for the constructor syntax in Lua. (查看原文)
    Grissiom 2011-05-19 20:33:01
    —— 引自第127页
  • if the function has one single argument and that argument is either a literal string or a table constructor, then the parentheses are optional (查看原文)
    3回复 2011-05-20 20:56:43
    —— 引自第35页
  • The constructor {x = 0, y = 0} is equivalent to {["x"] = 0, ["y"] = 0} (查看原文)
    1回复 2011-05-20 21:21:15
    —— 引自第24页
  • 有一种常用 Lua 习惯写法 “x=x or v”,它等价于: if not x then x = v end (查看原文)
    [已注销] 2012-04-06 15:15:09
    —— 引自第21页
  • 另外,还有一种习惯写法是 ”(a and b) or c“,这类似于 C 语言中的表达式 a ? b : c, 但是前提是 b 不为假。 例如,为了选出数字 x 和 y 中的较大者,可以使用以下语句: max = (x > y) and x or y (查看原文)
    [已注销] 2012-04-06 15:15:09
    —— 引自第21页
  • 所谓“尾调用”就是类似于 goto 的函数调用。当一个函数调用是另一个函数的最后一个动作时,该调用才算是一条“尾调用” (查看原文)
    [已注销] 2012-04-07 15:07:44
    —— 引自第53页
  • “一个函数在调用完另一个函数之后,是否就无其他事情需要做了” 有一些看似是“尾调用”的代码,其实都违背了这条准则。 (查看原文)
    [已注销] 2012-04-07 15:07:44
    —— 引自第53页
  • 在 Lua 中,只有 “return <func>(<args>)”这样的调用形式才算是一条“尾调用”。Lua 会在调用前对 <func> 及其参数求值,所以它们可以是任意复杂的表达式。 在 Lua 中“尾调用”的一大应用就是编写“状态机(state machine)”这种程序通常以一个函数来表示一个的状态,改变状态就是 goto (或调用)到另一个特定的函数。 (查看原文)
    [已注销] 2012-04-07 15:07:44
    —— 引自第53页
  • 泛型 for 的语法如下: for <var-list> in <exp-list> do <body> end for 做的第一件事情是对 in 后面的表达式求值。这些表达式应该返回 3 个值供 for 保存:迭代器函数、恒定状态和控制变量的初值。 在初始化步骤之后,for 会以恒定状态和控制变量来调用迭代器函数。然后 for 将迭代器函数的返回值赋予变量列表中的变量。如果第一个返回值为 nil,那么循环终止。 (查看原文)
    [已注销] 2012-04-09 14:11:46
    —— 引自第57页
  • 可以使用一种简单且安全的方法来括住一个字符串,那就是以 "%q" 来使用 string.format 函数。这样它就会用双引号来括住字符串,并且正确地转移其中的双引号和换行符等其他特殊字符。 (查看原文)
    [已注销] 2012-05-07 14:29:08
    —— 引自第108页
  • 元表还可以指定关系操作符的含义,元方法为 __eq(等于)、__lt(小于)和 __le(小于等于)。而其他 3 个关系操作符则没有单独的元方法, Lua 会将 a ~= b 转化为 not (a == b),将 a > b 转化为 b < a,将 a >= b 转化为 b <= a。 (查看原文)
    [已注销] 2012-05-07 16:05:47
    —— 引自第116页
<前页 1 2 后页>