尝试索引字段(无值)

问题描述 投票:0回答:1

[每当我尝试使用Body.pos时,它总是说这是一个零值。但是它在新函数中分配了一个值,因此它不应为nil。

我的代码:

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()不返回nil,但是Body.pos始终为nil。我不知道我在做什么错。

编辑:添加的Vector实现

lua
1个回答
1
投票

问题是您的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
© www.soinside.com 2019 - 2024. All rights reserved.