我需要运行一个有超过10个条件的测试脚本来验证。如果任何步骤失败,程序将失败,并且不会执行进一步的步骤。目前,我的计划是这样的:
boolean status = 0;
status = function1(param1, param2);
if (status) {
status = function2(param1, param2);
if(status) {
status = function3(param1, param2);
if(status) {
status = function4(param1, param2);
}
:
:
:
}
}
return status;
我对这么多嵌入式IF条款感到不满意。有没有更好的方法呢?
答案 0 :(得分:4)
翻译成Perl,你可以写:
sub testing
{
my $status;
if (($status = function1($param1, %param2)) &&
($status = function2($param1, %param2)) &&
($status = function3($param1, %param2)) &&
($status = function4($param1, %param2)))
{
# ...do whatever...
}
return $status;
}
或者,假设$status
只是一个布尔值:
sub testing
{
return 0 if !function1($param1, %param2) ||
!function2($param1, %param2) ||
!function3($param1, %param2) ||
!function4($param1, %param2);
# ...do whatever...
return 1;
}
或者:
sub testing
{
return 0 unless function1($param1, %param2);
return 0 unless function2($param1, %param2);
return 0 unless function3($param1, %param2);
return 0 unless function4($param1, %param2);
# ...do whatever...
return 1;
}
如果你真的有10个具有相同呼叫签名的功能,那么你甚至可以这样做:
sub testing
{
my @funcs = ( &function1, &function2, &function3, &function4, &function5,
&function6, &function7, &function8, &function9, &function10,
);
for my $funcref (@funcs)
{
return 0 unless &$funcref($param1, %param2);
}
# ...do whatever...
return 1;
}
请注意,前三个选项将处理不同的函数调用签名,只需更简洁的代码布局;最后几乎需要在列表中的每个函数上使用相同的函数调用签名。
答案 1 :(得分:3)
return function1($param1, %param2) &&
function2($param1, %param2) &&
function3($param1, %param2) &&
function4($param1, %param2);
只要其中一个函数返回false值,就会使用short-circuit来停止评估。
答案 2 :(得分:2)
请记住&&
短路,这意味着在以下声明中
func1 && func2
如果func1
评估为false,则永远不会评估func2
,因为此后&&
永远不会为真。
这意味着您可以在没有任何if
子句的情况下复制您的功能:
return func1 && func2 && func3 ...
答案 3 :(得分:0)
我想再提一个选项:
传递=真
传递=传递&& COND1 传递=传递&& COND2 ... 如果(通过)......
答案 4 :(得分:0)
另一个避免所有嵌套但与原始嵌套类似的选项:
boolean status = 0;
status = function1(param1, param2);
if (status) {
status = function2(param1, param2);
}
if (status) {
status = function3(param1, param2);
}
if (status) {
status = function4(param1, param2);
}
此样式可以轻松添加更多呼叫并轻松重新排序。