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

Posted

技术标签:

【中文标题】如何在 Lua (Love2D) 的库中定义一个类?【英文标题】:How to define a class within a library in Lua (Love2D)? 【发布时间】:2021-08-16 11:26:33 【问题描述】:

我尝试在名为“Point”的名为“basic.lua”的文件上定义我的类,并尝试在文件“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:new1, 2;
    PlayerVelocity = Basic.Point:new0, 0;
    PlayerPosition = Basic.Point:new0, 0;

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

end;

我在 Lua 的课程上遇到了很多困难,因此我们将不胜感激。

【问题讨论】:

【参考方案1】:

您的模块返回一个表,但在该表构造函数中您尝试定义一个全局函数Point。您不能创建这样的表字段。这是无效的语法。

return  function a() end 

使用

return  a = function() end 

改为。

PlayerAcceleration.AsString()

不会工作。使用PlayerAcceleration.AsString(PlayerAcceleration)PlayerAcceleration:AsString()

否则AsString 的参数self 将为零,导致当您尝试在函数体中对其进行索引时出错。

"x: " + self.x + ", y: " + self.y + "" 不是在 Lua 中连接字符串的方式。使用 Lua 的连接运算符 .. 而不是 +

您还打电话给不存在的Basic.Point:new。在继续尝试实现类之前,请先阅读 Lua 初学者教程,阅读 Lua 编程和 Lua 参考手册。

【讨论】:

是的,我在起草此文件时注意到,我没有将“AsString”添加到“PlayerAcceleration”中,所以我只是将它与任何其他编程语言(使用“。”)由于我没有调试“AsString”方法、连接和构造函数,因为代码在定义类之前就失败了,我什至没有意识到它们是一个问题。不过谢谢,看来我学到的东西比我原本打算的要多!

以上是关于如何在 Lua (Love2D) 的库中定义一个类?的主要内容,如果未能解决你的问题,请参考以下文章

在love2d中以随机时间间隔调用lua函数

Lua,Love2d,不同文件夹下两个类名相同的游戏

使用 Lua 在 Love2D 中需要一个共享对象 (.so) 文件

Love2D(Lua)中的面向对象编程

lua (love2d): 函数应该没有结束

love2d(lua)中的碰撞检测