2010-12-07 18 views
2

Ich habe eine vernachlässigbare Aufmerksamkeitsspanne, und da ich in La Vida Powershell zur Zeit eingetaucht bin, wird mein Code als solcheWie heißt dieses Konzept?

ich im Voraus entschuldigen formatiert werden, wenn diese an anderer Stelle diskutiert wurden, aber Da mein Problem ist, dass ich nicht weiß, wie das heißt, waren meine Bemühungen um das Googeln verständlicherweise fruchtlos.

drei Funktionen vorstellen:

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

, wenn der erste fehlschlägt, dann wollen Sie nicht, und muss die zweite nicht versuchen. Wenn der 2. fehlschlägt oder nie ausgeführt wird, dann hat es keinen Sinn, jemals den 3. durchzuführen.

eher als ein großes widerwärtig Nest von IF-Anweisungen wie diese ...

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

in bestimmten Sprachen (I GLAUBEN ich das C in Bezug 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 Vertrauen dass die 2. Hälfte Ihres Konditionals nur dann ausgeführt würde, wenn der erste als wahr/Erfolg/was auch immer zurück kam.

ebenfalls könnten Sie oder zwei Ausdrücke, und darauf vertrauen, dass die zweiten würde immer nur ausgeführt, und wenn die erste kamen zurück als falsch

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

Meine Frage ist zu prüfen: Was dieses Verhalten genannt wird? Unterstützt Powershell es auch?

Antwort

12

Es wird Kurzschlussauswertung genannt, und Powershell unterstützt es. Siehe die Abschnitte -and und -orhere.

BEARBEITEN Der ursprüngliche Link scheint gebrochen zu sein (Stand: 2014-11-05); Eine geeignete Alternative ist about_Logical_Operators.

+1

Mind the-Funktion (oder Bug?): Im Gegensatz zu anderen Programmiersprachen '-AND' und' -OR' in Powershell hat die gleiche Priorität: https://connect.microsoft.com/PowerShell/ feedback/details/285170/and-have-have-higher-priority-als-oder-es-ist-in-anderen-Programmiersprachen –

+0

Das war's! Hat mich total umgebracht, als ich versuchte, mich daran zu erinnern. Vielen Dank! – TheGreatTriscuit

+0

Das Äquivalent für Bash (und wahrscheinlich andere Unix-Shells) ist der '&&' Operator: 'foo && bar' führt' foo' aus, und dann wird nur 'bar' ausgeführt, wenn 'foo' erfolgreich ist (exit status 0). Ebenso 'foo || bar' führt nur 'bar' aus, wenn' foo' fehlschlägt (Status nicht-0 verlassen). –

2

Dies ist ein recht häufig Idiom in Perl, von wo aus sie migriert in Ruby-:

do_something or die 

wo die einige Fehler Behandlungsroutine und

do_something and do_something_else 

wobei do_something_else bedeutungslos ist, wenn do_something fehlschlägt.

Wie in den anderen Antworten erwähnt, verwendet dieses (ab) Kurzschlussverhalten und/oder faule Auswertung von booleschen Operatoren, die nicht alle Sprachen haben.

Beachten Sie, dass dies setzt voraus, dass offensichtlich do_something einen Booleschen Wert zurückgibt, den Erfolg oder Misserfolg zeigt, was auch bedeutet, dass seine echte Arbeit einiger Nebeneffekt ist.

Eine strukturiertere Art etwas Ähnliches zu tun wäre, eine Error Monade zu verwenden. Eine eingängige Einführung in die Error Monad und die gesamte Artikelserie für eine Einführung in das Konzept der Monaden im Allgemeinen finden Sie unter Yet Another Monad Tutorial (part 5: error-handling monads).

+0

Also ist es impliziert, dass Kurzschluss aus Sicht des Coding-Stils "schlecht" ist? Wird beim Schreiben/Lesen von Code für/von anderen das explizite Wenn/Dann-Setup für die Lesbarkeit beibehalten? – TheGreatTriscuit

1

PowerShell unterstützt Ausnahmen, also würde ich zuerst vorschlagen, dass Sie Funktionen auslösen Ausnahmen auslösen, wenn sie fehlschlagen. Dann würde der Kurzschluss für dich passieren.

Wenn Sie das aus irgendeinem Grund nicht tun können, dann ist dies eine andere Version der Kurzschlusslogik.

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