zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    搜索表头的例子-jqueryEasyUi
    Class^=,Class*= ,Class$=含义(转)
    js中slice方法(转)
    java中File的delete和deleteOnExit区别(转)
    BeanUtils.populate的方法的作用
    java NIO编程(转)
    java socket 之UDP编程
    彻底理解ThreadLocal(转)
    @RequestBody, @ResponseBody 注解详解(转)
    Spring MVC之@RequestMapping 详解
  • 原文地址:https://www.cnblogs.com/DOGame/p/4845294.html
Copyright © 2011-2022 走看看