2011-04-06 38 views
4

新到Lua,試圖找出如何使用middleclass的Lua - 試圖調用方法 '新'(一個零值)

main.lua做OOP:

require 'middleclass' 
require 'Person' 

local testPerson = Person:new("Sally"); //causes Runtime error: attempt to call method 'new' (a nil value) 
testPerson:speak(); 

人。 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 

爲什麼我得到那個錯誤?

回答

5

首先,行結束處的分號不是必需的,可能是編寫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 
+0

現在我明白了 - 沒有文件'/path/middleclass.init.lua'。要清楚,我的項目文件夾包含4個文件:main.lua,Person.lua,middleclass.lua,init.lua – sol 2011-04-06 19:12:31

+0

要麼將​​middleclass.lua和init.lua放在名爲middleclass的子目錄中,要麼只需要'init'。 – 2011-04-06 19:13:31

+0

好的,我把它們放在一個名爲middleclass的子目錄中,並將需求改爲'middleclass'。顯然不正確 - 模塊'middleclass'沒有找到:資源(middleclass.lu)在檔案中不存在 \t no field package.preload ['middleclass'] – sol 2011-04-06 19:18:24

1

由「法官」的答案是不正確的 - 沒有必要列入「middleclass.init」,並有上面所示的文件夾結構。

由於在Github上項目wiki說,你可以簡單地下載許可和「middleclass.lua」,放置在你的代碼目錄中的這些文件,然後簡單地做

require("middleclass"); 

確保你沒有在使用middleclass的文件中的模塊聲明,即沒有

module(...,package.seeall) 

..例如。

相關問題