Как называется эта концепция? - PullRequest
2 голосов
/ 08 декабря 2010

У меня незначительный объем внимания, и поскольку я сейчас погружен в La Vida Powershell , мой код будет отформатирован как

Я заранее прошу прощения, если это обсуждалось где-то в другом месте, но поскольку моя проблема в том, что я не знаю, как это называется, мои усилия по поиску были по понятным причинам бесплодными.

представьте три функции:

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

Если первый сбой, то вы не хотите и не должны пытаться 2-го. Если 2-й сбой или никогда не выполняется, то нет смысла пытаться выполнить 3-й.

, а не большое противное гнездо утверждений 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()

и верь, что 2-я половина твоего условного условия выполнилась бы только в том случае, если первая вернулась как истина / успех / что угодно.

аналогично вы можете ИЛИ два выражения и верить, что второе будет выполнено и проверено только в том случае, если первое вернется как ложное

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

Мой вопрос: как называется это поведение? Кроме того, PowerShell поддерживает это?

Ответы [ 4 ]

12 голосов
/ 08 декабря 2010

Это называется оценкой короткого замыкания, и Powershell поддерживает ее.См. Разделы -and и -or здесь .

РЕДАКТИРОВАТЬ Исходная ссылка не работает (по состоянию на 2014-11-05);подходящей альтернативой является about_Logical_Operators .

2 голосов
/ 08 декабря 2010

Это довольно распространенная идиома в Perl, откуда он перешел на Ruby:

do_something or die

, где die - некоторая подпрограмма обработки ошибок, а

do_something and do_something_else

, где do_something_elseне имеет смысла, если do_something терпит неудачу.

Как было упомянуто в других ответах, это (ab) использует поведение короткого замыкания и / или ленивую оценку булевых операторов, что не во всех языках.

Обратите внимание, что это, очевидно, предполагает, что do_something возвращает логическое значение, которое указывает на успех или неудачу, что также означает, что его real работа является некоторым побочным эффектом.

Более структурированный способделать что-то подобное - это использовать Error монаду.См. Еще одно учебное пособие по монадам (часть 5: Монады обработки ошибок) для получения доступного введения в монаду Error и весь цикл статей для введения в понятие монад.в общем.

1 голос
/ 09 декабря 2010

PowerShell поддерживает исключения, поэтому сначала я бы предложил, чтобы функции генерировали исключения в случае их сбоя.Тогда для вас произойдет короткое замыкание.

Если вы по какой-то причине не можете этого сделать, то это еще одна версия логики короткого замыкания.

GrowGrapes
if ($?) { ## If last command successful
    MakeWine
}
if ($?) { ## If last command successful
    DrinkWine
}
0 голосов
/ 08 декабря 2010

Это называется оценка короткого замыкания .

Не уверен, что Powershell его поддерживает ...

...