zoukankan      html  css  js  c++  java
  • lua的local问题

    1. 初识

      使用Local带来错误。自己写了一个递归的函数,结果报错:

    local fLocal = function(n)
        if (n == 1) then
            return n;
        else
            return n + fLocal(n-1)
        end
    end
    print("result:", fLocal(2))

      错误信息:

    lua: ...rkwork_diary	askLua_Studycoderain_storming.lua:152: attempt to call global 'fLocal' (a nil value)
    stack traceback:
        ...rkwork_diary	askLua_Studycoderain_storming.lua:152: in function 'fLocal'
        ...rkwork_diary	askLua_Studycoderain_storming.lua:155: in main chunk
        [C]: ?

      自己很纳闷,为什么会出现问题?看到报错,都会想到是没有识别,作用域的问题,结果参考[1],“上面这种方式导致Lua编译时遇到 fact(n-1) 并不知道他是局部函数 fact,Lua会去查找是否有这样的全局函数 fact”,会有一个大概的了解。作者也给了一个解决办法:

    local fLocal
    fLocal = function(n)
        if (n == 1) then
            return n;
        else
            return n + fLocal(n-1)
        end
    end
    print("result:", fLocal(2))

    2. 分析

      分析一下,函数fLocal中是不能识别自己的,那么编译器在到这里的时候还不能认识fLocal。这让我想起来某个语言的定义(具体是什么忘记了):只有匹配到"}",才算定义完毕,编译器才会识别这个定义。那是什么意思呢?拿这里的local fLocal来说只有编译器解释到“end”的时候才表示fLocal定义完毕,才会有这个变量,不然都是非法的,所以解决办法就是把fLocal单独拿出来,这样编译器扫描一遍的时候就认识了,不会报错。

    3. 升华

      还没有达到这个地步!想去看源代码,这里的local是怎么做的?在栈中的位置是个什么样的?如何编译和确定范围的?

    4. 补充

    (1)local和c/c++语言一样,变量定义的区域是从该变量定义的地方开始一直到local有效的区域结束(比如函数结尾,块结尾或者文件结尾)。

    (2)如果打印当前文件所有的local变量,就如打印_G中的内容一样呢?

    5.参考

    [1]http://blog.sina.com.cn/s/blog_67536d410100thqb.html

  • 相关阅读:
    2017——我们为什么选择JAVA?JAVA的发展方向和学习方法(必看)
    Java
    4中引用(强,软,弱,虚)侧重弱引用
    面试常见问题
    一个牛人给java初学者的建议
    java转换图片压缩生成webp格式
    JVM-String常量池与运行时常量池
    轮滑基础(一)(前摔,葫芦步,推步,A字转弯,弓步转弯)
    单词本
    可空值 DateTime? ToString("yy-MM-dd")
  • 原文地址:https://www.cnblogs.com/pk-run/p/4244989.html
Copyright © 2011-2022 走看看