Lua 尝试索引字段(零值)

Lua 尝试索引字段(零值),lua,Lua,每当我尝试使用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

每当我尝试使用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。我不知道我做错了什么


编辑:添加了矢量实现

问题在于OOP实现。元表
o
需要设置为局部变量

在代码中,
o
是一个全局变量,因此在创建新对象时总是重置它

向量={
-- ... 
,new=函数(self,x,y)
局部o={}
-- ...
结束
-- ... 
}
身体={
-- ... 
,新=功能(自身、位置、水平、加速度、质量)
局部o={}
-- ...
返回o
结束
-- ... 
}
b=正文:新()
打印(b.pos.x)--1
基本上,任何未声明为
local
的变量都会自动放入全局范围


此外,我建议使用一个linter(例如)来自动检测这样的问题。

问题在于OOP实现。元表
o
需要设置为局部变量

在代码中,
o
是一个全局变量,因此在创建新对象时总是重置它

向量={
-- ... 
,new=函数(self,x,y)
局部o={}
-- ...
结束
-- ... 
}
身体={
-- ... 
,新=功能(自身、位置、水平、加速度、质量)
局部o={}
-- ...
返回o
结束
-- ... 
}
b=正文:新()
打印(b.pos.x)--1
基本上,任何未声明为
local
的变量都会自动放入全局范围


此外,我建议使用一个过梁(例如)来自动检测此类问题。

无法重现该问题。您的代码工作正常
b.pos
不是
nil
。但是
Body.pos
当然是
nil
<代码>正文是一个类
b
是实例。您能解释一下
Vector
在哪里声明吗?正如@LeszekMazur所说的,我们需要查看Vector的实现,但是查看您的代码,我的第一个猜测是您需要将一个值传递给Vector的构造函数,因为它没有默认值?@rm代码添加了向量实现无法重现问题。您的代码工作正常
b.pos
不是
nil
。但是
Body.pos
当然是
nil
<代码>正文是一个类
b
是实例。您能解释一下
Vector
在哪里声明吗?正如@LeszekMazur所说的,我们需要查看Vector实现,但查看您的代码,我的第一个猜测是您需要将一个值传递给Vector的构造函数,因为它没有默认值?@rm code添加了Vector实现