谁能解释这条线是如何工作的?
return $y < 0 ? - pip2 : pip2 if $x == 0;
如果$y <0它返回,-pip2但它何时返回?$y >= 0$x != 0
此行来自此函数:
sub _atan {
    my( $y, $x ) = @_;
    return $y < 0 ? - pip2 : pip2 if $x == 0;
    return atan( $y / $x );
}
    谁能解释这条线是如何工作的?
return $y < 0 ? - pip2 : pip2 if $x == 0;
如果$y <0它返回,-pip2但它何时返回?$y >= 0$x != 0
此行来自此函数:
sub _atan {
    my( $y, $x ) = @_;
    return $y < 0 ? - pip2 : pip2 if $x == 0;
    return atan( $y / $x );
}
    后缀“if”表示仅在条件为真时才执行返回语句,所以
return $y < 0 ? - pip2 : pip2 if $x == 0;
是相同的
if ($x == 0)
{
    return $y < 0 ? - pip2 : pip2 ;
}
如果您对 ?: 三元运算符感到困惑,也可以将其重写为常规 if 语句,以产生这个
if ($x == 0)
{
    if ($y<0)
    {
        return -pip2;
    }
    else
    {
        return pip2;
    }
}
    它和
if($x == 0){
  if($y<0){
    return -pip2;
  }else{
    return pip2;
  }
}
整个函数就变成了:
sub _atan {
  my( $y, $x ) = @_;
  if($x == 0){
    if($y<0){
      return -pip2;
    }else{
      return pip2;
    }
  }else{
    return atan( $y / $x );
  }
}
    这是难以阅读的代码的一个很好的例子。
让我们比较几种重写代码示例的不同方法,看看我们如何保持简洁和提高可读性。
这个只有三元的版本为了简洁而获胜,但仍然很难阅读:
sub _atan {
    my( $y, $x ) = @_;
    return $x == 0 ? ($y < 0  ? -pip2 : pip2)
                   : atan( $y / $x );  
}
我发现链式条件运算符 (?:) 仅在后续运算符位于 else 位置时才可读:
sub _atan {
    my( $y, $x ) = @_;
    return $x != 0 ? atan( $y / $x ) : 
           $y < 0  ? -pip2           : pip2;  
}
仍然简短,但可读性有所提高。
但是使用ifandunless呢?我们也可以使用它们来编写简洁易读的代码吗?
就其性质而言,直接的 if/else 方法将更加冗长:
sub _atan {
    my( $y, $x ) = @_;
    my $atan;
    if( x == 0 ) {
        if( $y < 0 ) {
            $atan = -pip2;
        }
        else {
            $atan = pip2;
        }
    }
    else {
        $atan = atan( $y / $x )
    }            
    return $atan;  
}
很容易追溯上面的内容,看看结果会是什么。所以可读性获胜,但简洁性会受到影响。
我发现使用语句修饰符形式unless并if提供了一种将短路逻辑添加到代码块的简洁方法:
sub _atan {
    my( $y, $x ) = @_;
    return atan( $y / $x )
        unless $x == 0;
    return -pip2 if $y < 0;
    return pip2;  
}
这是简洁易读的,但在我看来,我们得到的回报似乎比我们需要的要多。
因此,如果我们在混合中引入条件运算符,我们会得到
sub _atan {
    my( $y, $x ) = @_;
    return atan( $y / $x )
        unless $x == 0;       
    return $y < 0  ? -pip2 : pip2;  
}
这种形式与上述任何一种形式一样简洁,但更容易理解:
sub _atan {
    my( $y, $x ) = @_;
    return atan( $y / $x )
        unless $x == 0;
    return $y < 0  ? -pip2 : pip2;  
}
嵌套的 if/else 子句可能难以理解。在构建决策代码时稍加注意可以大大提高可读性和可维护性,同时保持底层逻辑的简洁表达。
此处要修复的代码异味是条件运算符 ( ?:) 与语句修饰符形式 of的巴洛克式组合if。通过重新安排测试的顺序并仔细选择我们如何表示条件逻辑,我们能够保持简洁并澄清代码。
用于解决问题的行太多会使代码难以维护(总是不得不滚动)。嵌套 if 的解决方案要长 4 倍。想象一下使用小 4 倍的屏幕工作。我最喜欢的语法是:
sub _atan {
    my ($y, $x) = @_;
    return atan ($y / $x) if $x != 0;
    return $y < 0  ? -pip2 : pip2;
}
如果将它们放在下一行,则使用后缀运算符的好处会减少。此行顺序(由@daotoad 建议)允许将后缀条件放在更简单的行上。
初始语法也不错,但我不想处理包含以前帖子中建议的嵌套 if 的代码。