zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Notepad++ 使用nppexec插件配置简易开发环境
    Notepad++一键编译运行(Python、Java、C++)
    Java翁恺(1)——下载安装
    stm32正点原子学习笔记(30)窗口看门狗
    小程序模板
    Wireshark使用介绍(二):应用Wireshark观察基本网络协议
    Wireshark使用介绍(一):Wireshark基本用法
    Git 教程(四):标签和其他
    Git 教程(三):仓库与分支
    Git 教程(二):提交和回退
  • 原文地址:https://www.cnblogs.com/gaara-zhang/p/13206883.html
Copyright © 2011-2022 走看看