2009-08-14 49 views
1

我正在一個Perl模塊上,每當我打電話skip()方法我以下列方式中寫道:爲什麼我的Perl對象找不到它的skip()方法,儘管我可以將它稱爲子例程?

$cursor->skip(4); 

我得到:

 
Undefined subroutine &MyModule::Cursor::skip called at t/tester.pl line 24. 
     (in cleanup) invalid object at t/tester.pl line 24. 

當我把它想:

MyModule::Cursor::skip($cursor, 4); 

Perl發現它!

奇怪的是,如果我的名字 「skip」 別的( 「skipper」, 「hello」),這句法作品:

$cursor->skipper(4); 

我想也許skip()是一個 「祕密」 保留鍵字什麼的,但我也有方法sort()next()(我知道保留),並且這些工作正常。

我真的很想把這個方法命名爲「skip」。有誰知道爲什麼Perl找不到它?

+2

你能告訴我們一個完整的,但短期,例如,說明了什麼問題? – 2009-08-15 17:45:08

回答

6

skip()Test::More導出,因爲您的可執行文件名爲t/tester.pl,所以您可能已加載該文件。

ref($cursor)產生了什麼結果?它應該是一個有福的MyModule::Cursor對象,但「invalid object」錯誤可能表明對象構建不正確。

編輯:perldiag給出了另一個線索:「in cleanup」表示該對象的析構函數遇到了問題。假設您在對象中沒有析構函數,請創建一個MyModule::Cursor::DESTROY方法,該方法Data::Dump是此對象的外觀。

展示此行爲的示例代碼的簡短摘錄將非常有幫助。

+0

錯誤消息說它正在尋找* skip * on * MyModule :: Cursor *,所以我不認爲這是問題所在。 – 2009-08-15 17:55:40

+0

'MyModule :: Cursor :: skip'可能是'Test :: More''s skip雖然..雖然我覺得奇怪它找不到*任何*。看起來,最糟糕的情況是它找到了錯誤的'skip()'版本,而不是什麼都沒有。 – Ether 2009-08-15 18:02:07

2

沒有實際的代碼,很難調試它。

您是否在您的測試代碼中使用MyModule :: Cursor??當您更換跳過隊長,你是否以完全相同的方式從你的測試模塊調用它?您是否可以使用跳過從一次拋棄(單行或非常短的腳本)?

我要去的地方是在你的測試代碼中尋找錯誤,而不是模塊。

UPDATE:你不能在兩個不同的文件做一些類似於聲明方式對MyModule的::光標,是嗎?您收到的錯誤消息告訴我它有一個幸運的參考MyModule :: Cursor類型的對象,所以它知道類;但之後它找不到的定義跳過。你碰巧在一個文件中聲明瞭MyModule ::光標的一部分,並且在另一個文件中跳過了,並且你的測試模塊沒有包含第二個文件?或者你在的定義附近有什麼語法錯誤skip - 一個缺失的分號或不成對的大括號? (但話又說回來,爲什麼會MyModule的::光標::跳過工作,其中$ CURSOR->跳過不?)

相關問題