2 Stimmen

Wie lautet der Name für dieses Konzept?

Ich habe eine vernachlässigbare Aufmerksamkeitsspanne, und da ich mich in La Vida Powershell Im Moment wird mein Code folgendermaßen formatiert sein

Ich entschuldige mich im Voraus, wenn dies bereits an anderer Stelle diskutiert wurde, aber da mein Problem darin besteht, dass ich nicht weiß, wie es genannt wird, waren meine Google-Bemühungen verständlicherweise erfolglos.

drei Funktionen vorstellen:

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

Wenn der erste Versuch scheitert, wollen und dürfen Sie den zweiten nicht versuchen. Wenn die 2. fehlschlägt oder nie durchgeführt wird, ist es sinnlos, die 3. durchzuführen.

und nicht ein großes, unangenehmes Nest von IF-Anweisungen wie diese...

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

in bestimmten Sprachen (I BELIEVE Ich habe dies in Bezug auf C gelernt...) können Sie Folgendes tun:

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

oder sogar

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

und darauf vertrauen, dass die zweite Hälfte Ihrer Bedingung nur dann ausgeführt wird, wenn die erste als wahr/erfolgreich/was auch immer zurückkommt.

Ebenso könnte man zwei Ausdrücke ODER-verknüpfen und darauf vertrauen, dass der zweite nur dann ausgeführt und getestet wird, wenn der erste falsch ist

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

Meine Frage ist: Wie nennt man dieses Verhalten? Unterstützt Powershell es auch?

12voto

Gabe Moothart Punkte 30087

Dies wird als Kurzschlussauswertung bezeichnet, und Powershell unterstützt sie. Siehe die Abschnitte über -and y -or aquí .

EDIT Der ursprüngliche Link scheint defekt zu sein (Stand: 2014-11-05); eine geeignete Alternative ist über_Logische_Operatoren .

2voto

Jörg W Mittag Punkte 349574

Dies ist ein gängiges Idiom in Perl, von wo aus es nach Ruby migriert ist:

do_something or die

何所 die ist eine Fehlerbehandlungsroutine und

do_something and do_something_else

何所 do_something_else ist bedeutungslos, wenn do_something scheitert.

Wie in den anderen Antworten erwähnt wurde, wird dabei das Verhalten von Kurzschlüssen und/oder die faule Auswertung von booleschen Operatoren (ab)genutzt, was nicht in allen Sprachen möglich ist.

Beachten Sie, dass dies natürlich voraussetzt, dass do_something gibt einen booleschen Wert zurück, der Erfolg oder Misserfolg anzeigt, was auch bedeutet, dass seine real Arbeit ist ein Nebeneffekt.

Eine strukturiertere Art, etwas Ähnliches zu tun, wäre die Verwendung einer Error Monade. Siehe Noch ein Monaden-Tutorial (Teil 5: Monaden zur Fehlerbehandlung) für eine leicht verständliche Einführung in die Error Monad und die gesamte Artikelserie für eine Einführung in das Konzept der Monaden im Allgemeinen.

1voto

JasonMArcher Punkte 13198

PowerShell unterstützt Ausnahmen, daher würde ich zunächst vorschlagen, dass Sie Funktionen dazu bringen, Ausnahmen zu werfen, wenn sie fehlschlagen. Dann würde der Kurzschluss für Sie passieren.

Wenn Sie das aus irgendeinem Grund nicht können, dann ist das eine andere Version des Kurzschlusses der Logik.

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

0voto

Jon Punkte 15508

Es heißt Kurzschlussauswertung .

Ich bin nicht sicher, ob Powershell dies unterstützt...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X