Stavo lavorando su un pezzo di codice quando ho notato che un'istruzione if
poteva funzionare o bloccarsi in base all'ordine utilizzato per le parti connesse con and
.
Puoi replicare il problema in questo modo:
boolean func(String x) {
assert x
return true
}
v = "text"
if (v != "" && func(v)) {
println("Hello")
}
A seconda che venga utilizzato per primo v != ""
o func(v)
, if
provoca un errore di asserzione o meno.
Questo perché Groovy controlla la prima espressione e se quella è già falsa non valuta nemmeno la seconda poiché e l'operatore causeranno sempre l'espressione falsa.
Quindi in groovy le condizioni collegate sono combinate in questo modo:
if (v != "") {
if (func(v)) {
*[...]*
}
}
So che almeno alcuni altri linguaggi hanno un comportamento simile (credo che in Java si possa passare usando &
o &&
) ma mi chiedo è questa la strada da percorrere. Sembra abbastanza intuitivo da capire e non penso che trasmetta l'importanza dell'ordine in questa affermazione.
Come posso chiarire su base di codice che l'ordine è importante e deve essere preso in considerazione quando si altera il codice che lo circonda? O dovrei semplicemente dimenticarmene e supporre che le persone controllino qualcosa del genere?
Dopo aver svolto ulteriori ricerche, ho scoperto una voce sul sito di documentazione groovy di base per gli operatori: Groovy - Short Circuiting
Il termine generale sembra descrivere questa sembra essere una "valutazione di cortocircuito". Molto appropriato Ho adattato il titolo della domanda perché volevo inserirla ma non conoscevo la terminologia.