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:\LuaWorkSpace\LuaPrj\Testlua.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()
posted @ 2015-09-28 23:37  GamesClient  阅读(180)  评论(0编辑  收藏  举报