22.1
#!/usr/bin/lua
function getfield(f)
local v=_G
w=string.match(f,"[^%w%._]")
if w then
error("seperation character was wrong!")
end
for w in string.gmatch(f,"([%a_][%w_]*)(%.?)") do
v=v[w]
end
return v
end
22.2
1 local foo
2 do
3 local _ENV=_ENV
4 function foo ()
5 print(X)
6 end
7 end
8 X=13
9 _ENV=nil
10 foo()
11 X=0
创建了局部变量 foo,其将打印代码块内的私有环境的 X 字段,而私有环境被赋值为外部环境,所以第10行中调用 foo 会打印13.而在第9行环境被设置为nil,这时候的X=0将抛出异常。
22.3
1 local print=print
2 function foo (_ENV,a)
3 print(a+b)
4 end
5 foo({b=14},12)
6 foo({b=10},1)
第一行把print
声明为局部变量,foo
函数将由第一个参数获得指定的环境,并且在指定的环境中获得b的值。而a的值则由第二个实参获得,打印的结果将是26 11
。