【发布时间】:2017-12-22 13:45:23
【问题描述】:
我今天遇到了这个问题,并认为发布问答是谨慎的,因为我找不到类似的东西。
如果您发现此问题的重复,请随时投票结束。
以下子程序有条件地returns 输出;我认为它“笨拙”,因为它没有明确说明当条件不满足时返回给调用者的内容:
sub is_multiple_of_three {
my ( $value ) = @_ ;
return "$value is a multiple of 3"
unless $value % 3;
}
快速重写使澄清(更优雅的)子例程在所有情况下的预期行为变得很短:
sub is_multiple_of_three {
my ( $value ) = @_ ;
return if $value % 3;
return "$value is a multiple of 3";
}
当调用这两种风格的子例程时,我期望在列表上下文中找到return 之间的一些一致性:
- 条件计算结果为真时的字符串
- 当条件计算结果为假时,什么都没有(空列表)
但是很可惜,这种行为有点出乎意料:
use strict;
use warnings;
use Data::Printer;
use feature 'say';
my %subs = (
graceful => sub {
my ( $value ) = @_ ;
return if $value % 3;
return "$value is a multiple of 3";
},
clumsy => sub {
my ( $value ) = @_ ;
return "$value is a multiple of 3"
unless $value % 3;
},
);
for my $name ( keys %subs ) {
my $sub = $subs{$name};
say $name;
my @results = map { $sub->($_) } 1 .. 10;
p @results;
}
输出
graceful
[
[0] "3 is a multiple of 3",
[1] "6 is a multiple of 3",
[2] "9 is a multiple of 3"
]
clumsy
[
[0] 1,
[1] 2,
[2] "3 is a multiple of 3",
[3] 1,
[4] 2,
[5] "6 is a multiple of 3",
[6] 1,
[7] 2,
[8] "9 is a multiple of 3",
[9] 1
]
问题
“优雅”的风格表现如预期,但为什么“笨拙”的子在条件为假时返回整数?
【问题讨论】:
-
相关Should a subroutine always return explicitly?。我不确定这是否应该被视为重复。
标签: perl