对不起,我是LUA脚本的新手,我必须处理其他人编写的代码。 请不要关注代码,我的问题只是关于包含文件和优先级评估必须调用哪个函数,以防覆盖。
假设我有一个Terrain.lua文件,其中包含一个类Terrain,它有一个函数Terrain:generate()和Terrain:generate()调用Terrain:getLatitude()。
Terrain包含在脚本MyScript.lua中,它覆盖了Terrain:getLatitude(),如下所示:
include("Terrain");
function Terrain:getLatitude()
new code;
end
function myFunction()
local myTerrain = Terrain.create();
myTerrain.generate();
end
这具有覆盖getLatitude()的效果:当调用myTerrain.generate()时,generate()是包含“Terrain”的代码,但 getLatitude()是带有新代码的本地函数,即使是由包含的类中的函数调用。
现在假设我想将一些代码放在外部文件Custom.lua中。自定义(而不是MyScript)必须覆盖getLatitude()。 情况就是这样:
Terrain.lua包含Terrain类和这些函数
Terrain.create()
Terrain.generate()
Terrain.getLatitude()
MyScript.lua是正在执行的脚本,包括Custom:
include("Custom");
function myFunction()
return customFunction()
end
Custom.lua包含:
include("Terrain");
function Terrain:getLatitude()
new code;
end
function customFunction()
local myTerrain = Terrain.create();
myTerrain.generate();
end
现在,如果我从MyScript调用customFunction(),则使用来自Terrain的getLatitude(),而不是来自Custom的getLatitude()。我假设ovveride只能在正在执行的currenti文件中?如何在包含文件中实现覆盖?
我希望这个例子足以理解我的问题,而不需要发布大量代码。谢谢。
答案 0 :(得分:0)
首先,一些更正:你的问题中没有local function
; include
不属于任何lua标准,功能实际上可能非常重要。
最后,Lua没有实际的类系统,你在问题中使用的只是一个语法糖(在我发现它时误导和混淆)而不是表分配。 Lua是一种解释型语言,所以你看来作为一个类定义,不是从程序执行的最初阶段就知道的静态结构,而是从文件顶部到底部执行的代码。
因此,如果我们假设include
与require
类似,那么您的问题代码将等同于以下内容:
do--terrain.lua
Terrain = {
create=function()
local created_object
--some code to assign value to created_object
return created_object
end
}
Terrain.generate = function(self) end
Terrain.getLatitude = function(this_is_a_self_too)
--some code that uses `also_self` as a reference to the object when called as object:generate()
end
--do end block is essentially an equivalent of file, its local variables are not seen outside
--global variables it has assigned (like `terrain`) will stay accessible AFTER its end
--changes it done to global variables will also remain
end
do--Custom.lua
Terrain.getLatitude = function(this)--this is the assignment to a field in a table stored in the global variable Terrain
--this function will replace the one assigned to the `getLatitude` field
end
customFunction = function()
local myTerrain = Terrain.create();
myTerrain.generate();--this one probably needs `:` instead of `.`
--depends on actual code inside terrain.lua
end
end
do--MyScript.lua
myFunction= function()
return customFunction() --this line calls the global variable customFunction
end
end
因此,如果您的实际设置与相关设置相似,则“覆盖”将在执行Custom.lua后生效,并且对Terrain.getLatitude
的所有后续调用生效,无论它们是否有效我打电话给文件。 (以后任何文件都可以再次覆盖它,之后的所有调用都将使用新的文件)
在此设置中执行有限覆盖可能更复杂。这又取决于团队如何定义Terrain类和类系统本身的实际细节。