【问题标题】:One line conditional boolean return statement一行条件布尔返回语句
【发布时间】:2016-02-26 17:36:13
【问题描述】:

最近我来到了这个 Perl 代码段:

if($foo eq "foo") {
    return 1;   
}
my $bar = GetBar();
return ($bar eq "bar")

如果$foo 的值曾经等于foo,它将立即返回true,而不调用GetBar。假设这只会在语句 $foo eq "foo" 为真时发生,是否存在如下所示的单行条件布尔返回语句:

return only if $foo eq "foo";

含义:仅当$foo eq "foo" 为真时,$foo eq "foo" 的返回值。

我很好奇任何编码语言中是否有这样的声明。

【问题讨论】:

  • 您的实际问题是什么? if (EXPR) { return EXPR; } 在 Perl 中可以写成 return EXPR if EXPR; 吗?如果是这样,答案是肯定的。
  • 不幸的是,评论必须超过3个字符,所以我添加了这句话。不!

标签: perl return conditional


【解决方案1】:

在 Perl 中,如果比较结果为真,则不能返回比较返回的值,但是

if ($foo eq 'foo') { return 1; }

可以写成

return 1 if $foo eq 'foo';

与流控制语句一样,语句修饰符记录在 perlsyn 中。


顺便说一句,您发布的整个代码可以简化为以下内容:

return $foo eq 'foo' || GetBar() eq 'bar';

【讨论】:

  • 可爱,这与我想要的很接近。感谢您提供的简化示例,我不会这么想的。
  • 我会避免简化。最好在单独的语句中进行子调用以便于调试。从这个角度来看,问题中的原始代码是完美的。
  • @ysth,现在添加调试钩子还为时过早。绝对没有迹象表明需要任何东西。
【解决方案2】:

您说“仅当 $foo eq "foo" 为真时才返回 $foo eq "foo" 的值。”

你可以这样做

return 1 if $foo eq 'foo';

如果eq 没有重载,并且 1 是唯一可能的真值。

如果它被重载并且可能返回 false 或 1 以外的值,你可以这样做:

$_ and return $_ for $foo eq 'foo';

但前提是您的目标是尝试生成错误代码。

my $foofoo = $foo eq 'foo';
return $foofoo if $foofoo;

会好很多。

【讨论】:

    【解决方案3】:

    可能类似于三元运算符(在 python 中)。

    return True if foo == 'foo' else bar == 'bar'
    

    【讨论】:

    • 我对 Perl 有更多的经验,但现在我也在写很多 Python,我想念 Python 的 IF 表达式的 TrueValue-IfCondition-FalseValue 语法。 ($cond?$trueValue:$falseValue) 可读性较差。问:有没有允许 Python 命令的 Perl 习语?
    • ^ 你的意思是三元运算符吗?在 Perl 中:my $value = $cond ? $value_if_true : $value_if_false;return $cond ? $value_if_true : $value_if_false;
    猜你喜欢
    • 2015-05-03
    • 2012-08-16
    • 2021-09-27
    • 2013-10-01
    • 2016-11-08
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多