Попытка индексировать поле (нулевое значение) - PullRequest
0 голосов
/ 13 февраля 2020

Всякий раз, когда я пытаюсь использовать Body.pos, он всегда говорит, что это нулевое значение. Но ему присваивается значение в новой функции, поэтому оно не должно быть равно нулю.

Мой код:

Vector={
    x=nil,y=nil

    ,new=function (self,x,y)
        o={}
        setmetatable(o,self)
        self.__index=self

        o.x=x or 1
        o.y=y or 1

        return o
    end

    -- utility functions here
}

Body={
    pos=nil
    ,vel=nil
    ,acc=nil
    ,mass=nil

    ,new=function (self,pos,vel,acc,mass)
        o={}
        setmetatable(o,self)
        self.__index=self

        o.pos=pos or Vector:new()
        o.vel=vel or Vector:new()
        o.acc=acc or Vector:new()
        o.mass=mass or 1

        return o
    end

    ,applyForce=function (self,v)
        self.acc:add(v:scale(1/self.mass))
    end

    ,applyGravity=function (self)
        self.acc:add(GRAVITY_VECTOR)
    end

    ,step=function (self)
        self.vel:add(self.acc)
        self.pos:add(self.vel)

        self.acc:scale(0)
    end
}

Пробный код:

b=Body:new()
print(b.pos.x) -- shows error that pos is nil

Vector:new() не возвращает ноль, но все равно Body.pos всегда равно нулю. Я не знаю, что я делаю здесь не так.

РЕДАКТИРОВАТЬ: Добавлена ​​реализация вектора

1 Ответ

2 голосов
/ 14 февраля 2020

Проблема в вашей OOP реализации. Метатабельность o должна быть установлена ​​как локальная переменная.

В вашем коде o является глобальной переменной, поэтому вы всегда сбрасываете ее при создании нового объекта.

Vector={
    -- ... 
    ,new=function (self,x,y)
        local o={}
        -- ...
    end
    -- ... 
}

Body={
    -- ... 
    ,new=function (self,pos,vel,acc,mass)
        local o={}
        -- ...
        return o
    end
    -- ... 
}

b=Body:new()
print(b.pos.x) -- 1

Обычно любая переменная, которая не объявлена ​​как local, автоматически помещается в глобальную область.

Кроме того, я рекомендую использовать линтер (например, luacheck ) для автоматического обнаружения подобных проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...