【问题标题】:Lua - attempt to call method 'new' (a nil value)Lua - 尝试调用方法'new'(一个零值)
【发布时间】:2011-07-31 02:23:27
【问题描述】:

Lua 新手,试图弄清楚如何使用 middleclass 库进行 OOP

main.lua:

require 'middleclass'
require 'Person'

local testPerson = Person:new("Sally"); //causes Runtime error: attempt to call method 'new' (a nil value)
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

为什么会出现这个错误?

【问题讨论】:

    标签: oop lua


    【解决方案1】:

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

    ma​​in.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
    

    【讨论】:

    • 现在我明白了 - 没有文件 '/path/middleclass.init.lua'。明确一点,我的项目文件夹包含4个文件:main.lua、Person.lua、middleclass.lua、init.lua
    • 要么将 middleclass.lua 和 init.lua 放在名为 middleclass 的子目录中,要么只需要 'init'。
    • 好的,我将它们放在一个名为 middleclass 的子目录中,并将要求更改为“middleclass”。显然不正确-找不到模块'middleclass':资源(middleclass.lu)在存档中不存在,没有字段package.preload ['middleclass']
    • 您需要如上例所示需要 middleclass.init 或将 ?/init.lua 添加到您的搜索路径中。
    • 我通过将 middleclass.lua 移回根目录并将 require 更改为 'middleclass' 来实现它
    【解决方案2】:

    上面'Judge'的回答是不正确的——不需要包含“middleclass.init”并且具有如上所示的文件夹结构。

    如 Github 项目 wiki 上所述,您可以简单地下载许可证和“middleclass.lua”,将这些文件放在您的代码目录中,然后就可以了

    require("middleclass");
    

    确保您在使用中间类的文件中没有模块声明,即没有

    module(...,package.seeall)
    

    ..例如。

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 2015-06-15
      • 2017-04-03
      • 2013-12-15
      • 2023-03-16
      • 2017-03-30
      • 2019-09-15
      • 2013-05-11
      • 2015-10-25
      相关资源
      最近更新 更多