Lua переопределить функцию класса во включенном файле - PullRequest
0 голосов
/ 16 мая 2018

Извините, я новичок в скриптах 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

Теперь, если я вызываю customFunction () из MyScript, вместо getLatitude () из Custom используется getLatitude () из Terrain.Я предполагаю, что ovveride возможен только внутри исполняемого файла currenttiКак я могу добиться переопределения во включенном файле?

Надеюсь, этого примера достаточно, чтобы понять мою проблему, без публикации большого количества кода.Спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Во-первых, некоторые исправления: в вашем вопросе нет 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 и саму систему классов.

...