如何在Lua(Love2D)库中定义一个类?

3

我尝试在名为 "basic.lua" 的文件中定义了一个名为 "Point" 的类,并尝试在文件 "main.lua" 中实现它,但我一直收到这个错误:

Error

Syntax error: basic.lua:3: '(' expected near 'Point'



Traceback

[C]: at 0x7ffc269728f0
[C]: in function 'require'
main.lua:3: in function 'load'
[C]: in function 'xpcall'
[C]: in function 'xpcall'

这是我的“basic.lua”代码:

return {

  function Point(self, x, y)
    local Point = {

      x = x;
      y = y;

      AsString = function(self)
          print("{x: " + self.x + ", y: " + self.y + "}");
      end;
      
    }
    return Point;
  end;

};

这是我的 "main.lua" 代码:

function love.load()

    local Basic = require("basic");

    PlayerAcceleration = Basic.Point:new{1, 2};
    PlayerVelocity = Basic.Point:new{0, 0};
    PlayerPosition = Basic.Point:new{0, 0};

    love.graphics.print(PlayerAcceleration.AsString(), 0, 0, 0, 1, 1, 0, 0, 0, 0);

end;

我非常苦恼于Lua的类,希望能得到帮助。

1个回答

5
你的模块返回一个表格,但在该表构造函数内部,你尝试定义一个全局函数Point。你不能像那样创建一个表字段。这是无效的语法。
return { function a() end }

使用

return { a = function() end }

替代方案。

PlayerAcceleration.AsString()

不起作用。请使用PlayerAcceleration.AsString(PlayerAcceleration)PlayerAcceleration:AsString()

否则AsString的参数self将为nil,在函数体中尝试索引它将导致错误。

"{x:" + self.x + ", y:" + self.y + "}"不是Lua中连接字符串的方法。请使用Lua的连接运算符..代替+

此外,你正在调用不存在的Basic.Point:new 。在继续尝试实现类之前,请先进行Lua初学者教程、阅读《Programming in Lua》和《Lua参考手册》的学习。


是的,我注意到当我起草这个时,我没有在“PlayerAcceleration”上添加“AsString”,所以我就像在任何其他编程语言中一样(用“.”)把它扔了。由于我没有调试“AsString”方法、连接和构造函数,因为代码在类甚至定义之前就失败了,所以我甚至没有意识到它们是问题。不过还是谢谢你,看来我学到的比我最初打算的要多得多! - EpicJoeR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接