在我的模塊 Foo.pm 我有一些匿名函式,例如
our $anon = sub {
my $parameter = shift;
return $parameter * $parameter;
}
我Test::More用來為我的模塊中的函式撰寫單元測驗。
對于普通子例程,我可以使用包含子例程名稱的can_ok("Foo.pm", @subs)with 。@subs對于匿名函式,我收到以下錯誤:
Foo->can('$anon') failed
有沒有辦法取消參考函式并將它們傳遞給can_ok()?
uj5u.com熱心網友回復:
can通過查看繼承和模塊組合來確定事物是否可以執行方法。如果您有包含代碼參考的包變數,則不能使用這種測驗。這沒有道理。
您可以測驗您$anon的匯出是否正確。在上面的示例中,您使用的是沒有包名的,所以我假設您正在匯出它。但請記住,Exporter 建議不要匯出變數。
相反,我建議檢查包裝中是否有符號,以及它的型別是否正確。
isa_ok $Foo::anon, 'CODE';
如果該符號不存在或不是代碼參考,則該測驗將失敗。
要使用子名稱串列執行此操作,您可以使用插值,但您必須禁用 strict refs。
package Foo;
our $one = sub { 1 };
our $two = sub { 2 };
package main;
use strict;
use warnings;
use Test::More;
for my $sub (qw/ one two three/) {
no strict 'refs';
isa_ok ${ "Foo::$sub" }, 'CODE';
}
done_testing;
如果您想要匿名方法,您可能應該遵循約定并用下劃線命名它們,例如sub _anon.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/518423.html
上一篇:等效公式之間的差異
