这个概念的名称是什么?

时间:2010-12-07 22:53:02

标签: programming-languages powershell coding-style

我的注意力范围可以忽略不计,而且由于我现在沉浸在 La Vida Powershell 中,我的代码将被格式化为

如果在其他地方已经讨论过,我提前道歉,但由于我的问题是我不知道这叫什么,我的谷歌搜索努力已经毫无结果。

想象三个功能:

function GrowGrapes(){...} #grows grapes.
function MakeWine(){...} #uses said grapes to make wine
function DrinkWine(){...} #drinks said wine

如果第一次失败,那么你不想,也绝不能尝试第二次。如果第二次失败,或者从未跑过,那么就没有必要尝试执行第三次。

而不是像这样的一个令人讨厌的IF语句嵌套...

IF ([bool]GrowGrapes()) {
   IF ([bool]MakeWine()) {
      DrinkWine()
   }
}

在某些语言中(我相信我在参考C ...时学到了这一点),你可以做到以下几点:

IF ([bool]GrowGrapes() -AND [bool]MakeWine()) {DrinkWine()}

甚至

$rslt = ([bool]GrowGrapes() -AND [bool]MakeWine()) -AND [bool]DrinkWine()

并相信你的条件的下半部分只会在第一次回归为真/成功/无论什么时才会执行。

同样你可以使用OR两个表达式,并且相信如果第一个返回为假,第二个只会被执行和测试

[bool]MakeWine() -OR [bool]BuyWine()      #only attempt to purchase wine if 
                                          #the attempt to make it has failed

我的问题是:这个行为叫什么?还有,powershell支持吗?

4 个答案:

答案 0 :(得分:12)

它被称为短路评估,Powershell确实支持它。请参阅-and-or here上的各个部分。

编辑原始链接似乎已损坏(截至2014-11-05);一个合适的替代方案是about_Logical_Operators

答案 1 :(得分:2)

Perl中这个非常常见的习惯用法,从迁移到Ruby的地方:

do_something or die

其中die是一些错误处理例程和

do_something and do_something_else

如果do_something_else失败,do_something毫无意义。

正如其他答案中所提到的,这个(ab)使用了布尔运算符的短路行为和/或延迟评估,这并非所有语言都有。

请注意,这显然假设do_something返回一个表示成功或失败的布尔值,这也意味着它的真实工作是一些副作用。

更有条理的做类似事情的方法是使用Error Monad。请参阅Yet Another Monad Tutorial (part 5: error-handling monads),了解Error Monad的平易近人的介绍,以及整篇文章系列,了解Monads的概念。

答案 2 :(得分:1)

PowerShell支持异常,所以首先我建议你让函数在失败时抛出异常。然后就会发生短路。

如果由于某种原因你不能这样做,那么这是另一种短路逻辑版本。

GrowGrapes
if ($?) { ## If last command successful
    MakeWine
}
if ($?) { ## If last command successful
    DrinkWine
}

答案 3 :(得分:0)

它被称为short circuit evaluation

不确定Powershell是否支持它......