サブルーチンとして呼び出すことができるにもかかわらず、Perl オブジェクトが Skip() メソッドを見つけられないのはなぜですか?
-
16-09-2019 - |
質問
私は 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);
パールが見つけた!
奇妙なことに、私が「skip
" 他に何か ("skipper
", "hello
")、この構文は機能します。
$cursor->skipper(4);
もしかしたらと思った skip()
これは「秘密」の予約キーワードか何かでしたが、次のような名前のメソッドもあります sort()
そして next()
(予約されていることはわかっています)、それらは正常に機能します。
このメソッドに名前を付けたいと思っています。skip
.」 Perl がそれを見つけられない理由を知っている人はいますか?
解決
skip()
は、あなたが実行可能なので、ロードされている可能性がある、 Test::More
するからエクスポートされますt/tester.pl
という名前が付けられます。
何があなたをもたらすref($cursor)
ていますか?それは祝福MyModule::Cursor
オブジェクトである必要がありますが、「invalid object
」エラーは、オブジェクトが適切に構築されていません示唆される可能性があります。
EDIT:問題がで遭遇したことを意味し、 "in cleanup
":はperldiag には、別の手がかりを与えますオブジェクトのデストラクタ。あなたはすでにそれがこの時点でどのように見えるかを確認するために、オブジェクトをMyModule::Cursor::DESTROY
s Data::Dump
メソッドを作成し、オブジェクトでデストラクタを持っていないと仮定します。
この挙動を示すコード例の簡潔なスニペットは非常に有用であろう。
他のヒント
実際のコードがなければ、これをデバッグするのは困難です。
あなたは MyModule::Cursor を使用する テストコードの中で?交換したとき スキップ と スキッパー, 、テストモジュールからまったく同じ方法で呼び出していましたか?使用できますか スキップ 使い捨て(ワンライナーまたは非常に短いスクリプト)からですか?
ここでは、モジュールではなくテストコード内のエラーを探します。
アップデート: メソッドを宣言するようなことはしていません MyModule::カーソル 2 つの異なるファイルに分かれていますよね?表示されるエラー メッセージは、次のタイプのオブジェクトへの祝福された参照があることを示しています。 MyModule::カーソル, 、したがって、クラスについて知っています。しかし、その後、の定義が見つかりません スキップ. 。たまたま一部を宣言していますか? MyModule::カーソル 1 つのファイル内にあり、 スキップ 別のファイルでは、テスト モジュールに 2 番目のファイルが含まれていませんか?それとも、定義のどこかに構文エラーがありますか? スキップ -- セミコロンが欠落しているか、対になっていない中括弧がありませんか?(しかし、繰り返しになりますが、なぜ MyModule::Cursor::skip どこで働くか $cursor->スキップ ではない?)