• Lua 作用域问题


     function fact (n)
    if n==0 then 
    return 1

    else 
       return n*fact(n-1)
    end
    end
    print("Enter a number:")
    a = io.read("*number")
    print (fact(a))
    会报错:
     E:LuaWorkSpaceLuaPrjTestlua.lua:(8): attempt to perform arithmetic on local 'n' (a nil value)
    解决方法:

    local fact = function (n)
    if n == 0 then return 1
    else return n*fact(n-1) -- buggy
    end
    end
    这个有错,一点作用域的bug,调用fact(n-1)时候,local fact还没定义好。
    所以得写
    local fact
    fact = function(n)...
    或者用语法糖 local function foo (<params>) <body> end。
    它会展开为 local foo; foo = function (<params>) <body> end

    -----------------------------------------------------------

     local f = function ()
        print(aa)
    end

    local aa= 123
    f()
    这个会打印什么? nil,因为lua是词法作用域,lexical scoping。你把module想象成一个java中函数内部的执行语句,aa是局部变量。而不要把它想象成类声明,aa对应成员变量。

    local f = function ()
        print(aa)
    end

    aa=321
    f()
    这个打印什么呢?321,理解这个关键是aa=321,等价于_G['aa']=321。注意它只是修改了全局变量。f调用照样是lexical scoping。而不是dynamic scoping.

    如果需要f,g都各有调用,请先local g;再声明f,再赋值g

    local i=1
    local g
    local f = function ()
        if (i == 3) then
            return
        end
        g()
        print("in f")
    end

    g=function()
        i=3
        f()
        print("in g")
    end

    f()
  • 相关阅读:
    序列化
    输入输出流——字符流部分
    输入输出流——字节流部分
    GitHub10岁之际HanLP自然语言处理包用户量跃居榜首
    hadoop大数据处理平台与案例
    dkhadoop的自然语言处理技术介绍
    hadoop大数据技术架构详解
    hadoop框架结构介绍
    Hadoop集群环境搭建步骤说明
    快速了解掌握中文自然语言处理
  • 原文地址:https://www.cnblogs.com/DOGame/p/4845294.html
Copyright © 2020-2023  润新知