我正在研究一个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找不到它?
答案 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 的情况下工作?)