Lua 笔记7
1. 词法定界:
定界:指变盘与变量所对应实体之间绑定关系的有效范围, 在部分情况下也常与可见性 ( visibility )混用。
词法定界也被称为静态定界( static scoping ),常常与动态定界( dynamic scoping )比较。
其中 前者被大多数现代编程语言采用,后者常见于Bash等Shell语言。
使用静态定界时, 一个变量的可见性范围仅严 格地与组成程序的静态具体词法上下文有关,而与运行时的具体堆钱调用无关;
使用动态定界时,一个变量的可 见性范围在编译时无法确定, 依赖于运行时的实际堆核调用情况。
2. 函数是第一类值,函数也是值 foo = function (x )return 2*x end 。等同于function foo (x )return 2*x end -- 是其美化形式。
3. 所有的函数都是匿名的。比如,print函数,print指的是保存该函数的变量。
匿名性便利操作:table.sort(network, function (a,b )return (a. name > b.name) end)
像函数sort,称之为高阶函数。
4. 函数(作变量)用法
Lib == {} function Lib.foo (x ,y )return x + y end function Lib.goo (x ,y )return x - y end 等价于 Lib = { foo = function (x ,y) return x + y end , goo = function (x ,y) return x - y end }
5. local function foo (params) body end 等价于 local foo; foo = function (params) body end 举例理解:
local fact = function (n) if n == 0 then return 1 else return n*fact(n-1) -- 有问题,编译至此时fact尚未定义。解决如下 end end local fact fact = function (n) if n == 0 then return 1 else return n*fact(n-1) -- 没问题 end end
6. 前向声明:
local f -- “前向”声明 local function g () some code f () some code end function f () -- 不可加local,否则生成一个全新的变量f some code g() some code end
7. 闭包,非局部变量(既不是全局变量,也不是局部变量)
function newCounter () local count = 0 -- 非局部变量 return function () count = count + 1 return count end end c1 = newCounter () -- 创建的函数已经成功返回 Print(c1())--> 1 -- 依旧可以访问count变量(闭包机制) Print(c1()) --> 2 -- 依旧可以访问count变量(闭包机制) 1.闭包就是一个函数外加能够使该函数正确访问非局部变量所需的其他机制。 2.Lua语言中只有闭包没有函数。函数只是闭包的一种原型。 3.闭包对于回调也很管用: function digitButton (digit) return Button{ label = tostring (digit), action = function() add_to_display(digit) end } end action是按钮被按下时调用的回调函数。回调可能发生在digitButton早已执行结束之后,那时,digit已经超出了作用范围(貌似),但闭包仍可访问.
8. 闭包另一用途:重新定义函数,甚至是预定义函数。 进而可创建沙盒。
do local oldOpen = io.open local access_OK = function (filename, mode ) check access end io. open = function (filename, mode ) --闭包重定义 if access_OK(f ilename , mode ) then return oldOpen (filename , mode ) else return nil, ”access denied" end end end 上述代码即是沙盒(创建安全的运行时环境,当执行一些诸如从远程服务器上下载到的未受信任代码( untrusted code )时,安全的运行时环境非常重要。 )举例。 借助这种机制可以根据需求裁剪具体的运行环境。
9. 特征函数使用举例。
设计系统,首先得设计合适的数据结构。在Lua中,可试着使用面向对象的方案,利用继承等。也可以直接利用特征函数(集合 A 的特征函数 fA 是指 当且仅当 x 属于 A 时 fA(x) 成立)。举例:
-- 一个圆形区域 function disk1 (x, y) return (x - 1.0)^2 + (y - 3.0)^2 <= 4.5^2 end -- 进阶 function disk(cx, cy, r) return function(x, y) return (x - cx)^2 + (y - cy)^2 <= r^2 end end