如何在Lua/LuaJ中创建全局变量"immutable"?
How to make global variables "immutable" in Lua/LuaJ?
描述
我正在做一个 LuaJ 程序,这里有一个像这样的 lib 脚本:
function foo()
print("foo");
end
我希望 foo
函数可以在其他脚本中 直接调用 (没有 require
),但在不同的脚本中执行不可变。 (即使一个脚本覆盖了它,它也像其他脚本中的原始方式一样执行。)
例如,这里是脚本 1:
foo = function()
print("bar");
end
这是脚本 2:
foo();
完成了什么
这两个问题我都看到了。他们确实有效,但不是解决这个问题的方法。
LuaJ How to avoid overriding existing entries in Globals table
Preventing Function Overriding in Lua Table
Making global environment access-only (Lua)
我尝试在每次执行脚本或设置 local _ENV
时加载 lib,但是因为可能会有从 Java 到 Lua 的进一步回调,所以它无法正常工作。
我现在通过创建一个 Globals
来处理它,每次在 Java 中加载一个脚本时加载 lib 脚本,如下所示:
public static void main(String[] args) {
loadAndCallViaDifferentEnv(libPath, script1);
loadAndCallViaDifferentEnv(libPath, script2);
}
static void loadAndCallViaDifferentEnv(String libPath, String scriptPath) {
Globals globals = JsePlatform.standardGlobals();
globals.loadfile(libPath).call();
globals.loadfile(scriptPath).call();
}
效果不错,就是成本高。有没有更好的方法?
我假设您想保护三个函数不被覆盖:foo1
、foo2
和 print
-- define foo1 and foo2 inside protected table instead of as usual globals
local protected = {}
function protected.foo1()
print("foo1");
end
function protected.foo2()
print("foo2");
end
-- if a function to be protected already exists, remove it from globals:
protected.print = print
print = nil
-- Now set the metatable on globals
setmetatable(_G, {
__index = protected,
__newindex =
function(t, k, v)
if not protected[k] then
rawset(t, k, v)
end
end
})
现在您可以在没有 require
的情况下从其他模块调用 foo1
、foo2
和 print
,但您不能覆盖它们:
-- the script 1:
foo1 = function()
print("bar");
end
foo1(); -- original protected.foo1() is invoked
-- the script 2:
foo1(); -- original protected.foo1() is invoked
描述
我正在做一个 LuaJ 程序,这里有一个像这样的 lib 脚本:
function foo()
print("foo");
end
我希望 foo
函数可以在其他脚本中 直接调用 (没有 require
),但在不同的脚本中执行不可变。 (即使一个脚本覆盖了它,它也像其他脚本中的原始方式一样执行。)
例如,这里是脚本 1:
foo = function()
print("bar");
end
这是脚本 2:
foo();
完成了什么
这两个问题我都看到了。他们确实有效,但不是解决这个问题的方法。
LuaJ How to avoid overriding existing entries in Globals table
Preventing Function Overriding in Lua Table
Making global environment access-only (Lua)
我尝试在每次执行脚本或设置 local _ENV
时加载 lib,但是因为可能会有从 Java 到 Lua 的进一步回调,所以它无法正常工作。
我现在通过创建一个 Globals
来处理它,每次在 Java 中加载一个脚本时加载 lib 脚本,如下所示:
public static void main(String[] args) {
loadAndCallViaDifferentEnv(libPath, script1);
loadAndCallViaDifferentEnv(libPath, script2);
}
static void loadAndCallViaDifferentEnv(String libPath, String scriptPath) {
Globals globals = JsePlatform.standardGlobals();
globals.loadfile(libPath).call();
globals.loadfile(scriptPath).call();
}
效果不错,就是成本高。有没有更好的方法?
我假设您想保护三个函数不被覆盖:foo1
、foo2
和 print
-- define foo1 and foo2 inside protected table instead of as usual globals
local protected = {}
function protected.foo1()
print("foo1");
end
function protected.foo2()
print("foo2");
end
-- if a function to be protected already exists, remove it from globals:
protected.print = print
print = nil
-- Now set the metatable on globals
setmetatable(_G, {
__index = protected,
__newindex =
function(t, k, v)
if not protected[k] then
rawset(t, k, v)
end
end
})
现在您可以在没有 require
的情况下从其他模块调用 foo1
、foo2
和 print
,但您不能覆盖它们:
-- the script 1:
foo1 = function()
print("bar");
end
foo1(); -- original protected.foo1() is invoked
-- the script 2:
foo1(); -- original protected.foo1() is invoked