为什么我的Perl对象不能找到它的skip()方法,即使我可以将其称为子例程?

时间:2009-08-14 21:04:51

标签: perl perl-module xs

我正在研究一个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 个答案:

答案 0 :(得分:6)

skip()Test::More导出,您可能已加载该perldiag,因为您的可执行文件名为t/tester.pl

ref($cursor)给你带来了什么?它应该是一个受祝福的MyModule::Cursor对象,但“invalid object”错误可能表明该对象未正确构建。

编辑:{{3}}给出了另一条线索:“in cleanup”表示对象的析构函数遇到了问题。假设您在对象中还没有析构函数,请创建一个MyModule::Cursor::DESTROY方法,Data::Dump该对象,以便在此时查看它的外观。

展示此行为的简洁示例代码片段将非常有用。

答案 1 :(得分:2)

如果没有实际代码,很难对此进行调试。

你在测试代码中使用MyModule :: Cursor 吗?当您将跳过替换为队长时,您是否以完全相同的方式从测试模块中调用它?您是否可以使用跳过一次性(单行或非常短的脚本)?

我要去的地方是在测试代码中找错,而不是模块。

UPDATE:你没有在两个不同的文件中声明 MyModule :: Cursor 上的方法,是吗?您收到的错误消息告诉我它有一个对 MyModule :: Cursor 类型的对象的祝福引用,因此它知道该类;但是它找不到跳过的定义。您是否恰好在一个文件中声明 MyModule :: Cursor 的一部分,而在另一个文件中声明跳过,并且您的测试模块不包含第二个文件?或者你在跳过的定义周围有一个语法错误 - 缺少分号或不成对的大括号? (但话又说回来,为什么 MyModule :: Cursor :: skip 能够在 $ cursor-> skip 的情况下工作?)