检查可选模块可用性的最佳方法
Best way to check optional module availability
在我正在编写的模块中,只有一个方法需要一个额外的模块,所以我希望通过不在 META6.json 的 depends
部分中列出该模块来使该模块成为可选模块文件。如果可选模块不可用,该方法将 return 一个失败对象。
我知道我可以做这样的事情:
if (try require Optional::Module) !=== Nil {
# go on
} else {
# fail
}
有什么更好的方法吗?
是这样的吗?
my $loaded = False;
CATCH {
default { $loaded = True }
}
require Optional::Module;
if ( ! $loaded ) {
# Fail
}
# Go on
在这种情况下,它将尝试加载模块并在运行时捕获异常。
我要感谢所有回答或评论此问题的人。
我对我提出的解决方案和我的问题的评论中给出的两个解决方案进行了基准测试:
my $pre = now;
for ^10000 {
$*REPO.repo-chain.map(*.?candidates('Available::Module').Slip).grep(*.defined);
$*REPO.repo-chain.map(*.?candidates('Unavailable::Module').Slip).grep(*.defined);
}
say now - $pre; # 13.223087
$pre = now;
for ^10000 {
$*REPO.resolve(CompUnit::DependencySpecification.new(:short-name("Available::Module")));
$*REPO.resolve(CompUnit::DependencySpecification.new(:short-name("Unavailable::Module")));
}
say now - $pre; # 3.105257
$pre = now;
for ^10000 {
(try require Available::Module) !=== Nil;
(try require Unavailable::Module) !=== Nil;
}
say now - $pre; # 4.963793
更改模块名称以匹配您系统上可用的模块名称和不可用的模块名称。
评论在我的电脑上以秒为单位显示结果。
在我正在编写的模块中,只有一个方法需要一个额外的模块,所以我希望通过不在 META6.json 的 depends
部分中列出该模块来使该模块成为可选模块文件。如果可选模块不可用,该方法将 return 一个失败对象。
我知道我可以做这样的事情:
if (try require Optional::Module) !=== Nil {
# go on
} else {
# fail
}
有什么更好的方法吗?
是这样的吗?
my $loaded = False;
CATCH {
default { $loaded = True }
}
require Optional::Module;
if ( ! $loaded ) {
# Fail
}
# Go on
在这种情况下,它将尝试加载模块并在运行时捕获异常。
我要感谢所有回答或评论此问题的人。
我对我提出的解决方案和我的问题的评论中给出的两个解决方案进行了基准测试:
my $pre = now;
for ^10000 {
$*REPO.repo-chain.map(*.?candidates('Available::Module').Slip).grep(*.defined);
$*REPO.repo-chain.map(*.?candidates('Unavailable::Module').Slip).grep(*.defined);
}
say now - $pre; # 13.223087
$pre = now;
for ^10000 {
$*REPO.resolve(CompUnit::DependencySpecification.new(:short-name("Available::Module")));
$*REPO.resolve(CompUnit::DependencySpecification.new(:short-name("Unavailable::Module")));
}
say now - $pre; # 3.105257
$pre = now;
for ^10000 {
(try require Available::Module) !=== Nil;
(try require Unavailable::Module) !=== Nil;
}
say now - $pre; # 4.963793
更改模块名称以匹配您系统上可用的模块名称和不可用的模块名称。
评论在我的电脑上以秒为单位显示结果。