Lua - 尝试调用方法'new' (一个空值)

新手 Lua,试图使用 middleclass 库实现面向对象编程。

main.lua:

require 'middleclass'
require 'Person'

local testPerson = Person:new("Sally"); // 出现运行时错误: 尝试调用方法'new' (一个空值)
testPerson:speak();

Person.lua:

module(..., package.seeall)
require 'middleclass'

Person = class('Person');
function Person:initialize(name)
  self.name = name;
  print("INITIALIZE: " .. self.name);
end

function Person:speak()
  print('Hi, I am ' .. self.name ..'.')
end

我为什么会得到这个错误?

原文链接 https://stackoverflow.com/questions/5571490

点赞
stackoverflow用户1491
stackoverflow用户1491

首先,行末的分号不是必需的,可能是编写 Lua 代码的一种不良习惯。其次,我在两个文件中将require 'middleclass'更改为require 'middleclass.init',并删除了module(..., package.seeall)。之后,在我的计算机上使用 Lua 5.1.4 运行示例代码正常。

main.lua

require 'Person'

local testPerson = Person:new("Sally")
testPerson:speak()

Person.lua

require 'middleclass.init'

Person = class('Person')

function Person:initialize(name)
  self.name = name
  print("INITIALIZE: " .. self.name)
end

function Person:speak()
  print('Hi, I am ' .. self.name ..'.')
end

您可能直接包含了 middleclass.lua 文件。但它并不是这样设置的。意图是包括 _middleclass/init.lua_。

如果您按照下面所示将两个文件使用并排放置在文件夹中,则可正常工作。

./main.lua
./Person.lua
./middleclass/init.lua
./middleclass/middleclass.lua
2011-04-06 19:05:14
stackoverflow用户490123
stackoverflow用户490123

上面的'Judge'的回答是不正确的 - 没有必要包括"middleclass.init"并且有上面显示的文件夹结构。

如Github项目wiki所述,您只需下载许可证和'middleclass.lua',将这些文件放置在您的代码目录中,然后只需运行

require("middleclass");

请确保文件中使用middleclass时没有模块声明,例如不要有

module(...,package.seeall)
2011-08-14 12:35:53