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))
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()
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()