2

我想在 Lua 5.1 (luajit) 的同一个函数上设置不同的环境:

f = function() print(a) end
b = setfenv(f, { a = 1, print = print })
c = setfenv(f, { a = 2, print = print })

我想打印不同的b()数字c()

我已经通过基于string.dumpenv 创建新的函数块并将其绑定到它来破解一种方法,但是有更好更优雅的方法吗?或者,一个函数是否可以根据某些条件以某种方式具有不同的上值?

function bind_env(f, env)
  return setfenv(loadstring(string.dump(f)), env)
end

谢谢!

4

1 回答 1

1

函数的上值由其词法范围决定:

function test(a, b)
   function func(x) -- sees x, a and b
       print(a*x+b)
   end
   return func
end

f12 = test(1, 2) -- x+2
f23 = test(2, 3) -- 2x+3

f12(4)
f23(4)

最后两行打印 6 和 11。从技术上讲,test(a,b)为每个 a、b 返回一个不同的函数对象,但从概念上讲,它返回同一函数的不同闭包(相同的字节码序列)。所以如果你有

function func(a)
    return function() print(a) end
end 

你可以为每个 a 定义一个不同的闭包:

b = func(1) -- a=1
c = func(2) -- a=2

但是请注意,这b==c是错误的,但这可能是一件好事。

于 2014-09-02T03:41:28.860 回答