groovy
Groovige Wahrheit (Wahrhaftigkeit)
Suche…
Bemerkungen
Groovy wertet Bedingungen in if , while und für Anweisungen genauso wie Java für Standard-Java-Bedingungen aus : In Java müssen Sie einen booleschen Ausdruck (einen Ausdruck, der einen booleschen Wert ergibt) angeben, und das Ergebnis ist das Ergebnis der Bewertung.
In Groovy ist das Ergebnis dasselbe wie in Java für diese Bedingungen (keine Beispiele angegeben, dies ist Standard-Java).
Der andere Mechanismus zur Bewertung der Wahrhaftigkeit , der durch Beispiele gezeigt wird, kann wie folgt zusammengefasst werden:
- Zahlen: Ein Nullwert wird als falsch ausgewertet, nicht Null bis wahr.
- Objekte: Eine NULL-Objektreferenz wird mit "false" ausgewertet, eine Nicht-NULL-Referenz auf "true".
- Character: Ein Zeichen mit einem Nullwert wird zu false ausgewertet, andernfalls true.
- String: Eine Zeichenfolge ergibt den Wert "true", wenn sie nicht null und nicht leer ist, und false, wenn sie null oder leer ist (gilt auch für GStrings und CharSequences).
- Sammlungen und Karten (einschließlich Unterklassen List , Map , Set , HashSet ...): Berücksichtigt auch die Größe und wertet sie als wahr aus, wenn die Sammlung nicht null und nicht leer ist, und false, wenn sie null oder leer ist.
- Enumerationen und Iteratoren werden mit "true " oder " null" bewertet und sind weitere Elemente (groovy wertet hasMoreElements oder hasNext für das Objekt aus), false, wenn null oder keine weiteren Elemente vorhanden sind.
- Matcher: Ein Matcher wird mit true ausgewertet, wenn mindestens eine Übereinstimmung vorhanden ist, und false, wenn keine Übereinstimmung gefunden wird.
- Abschluss: Ein Abschluss wertet die Bewertung des vom Abschluss zurückgegebenen Ergebnisses aus.
Die asBoolean-Methode kann in einer benutzerdefinierten Klasse überschrieben werden, um eine benutzerdefinierte boolesche Auswertung bereitzustellen.
Zahlen boolesche Auswertung
Für Zahlen wird ein Nullwert als falsch, nicht Null bis wahr ausgewertet
int i = 0
...
if (i)
print "some ${i}"
else
print "nothing"
druckt "nichts"
Strings boolesche Auswertung
Eine Zeichenfolge (einschließlich GStrings) wird als wahr ausgewertet, wenn nicht null und nicht leer
def s = ''
...
if (s)
println 's is not empty'
else
println 's is empty'
werde drucken: 's ist leer'
Sammlungen und Karten boolesche Auswertung
Sammlungen und Karten werden als wahr ausgewertet, wenn nicht null und nicht leer, und falsch, wenn null oder leer
/* an empty map example*/
def userInfo = [:]
if (!userInfo)
userInfo << ['user': 'Groot', 'species' : 'unknown' ]
fügt user: 'Groot' , species : 'unknown'
als StandardbenutzerInfo, da die BenutzerInfo-Map leer ist (beachten Sie, dass die Map hier nicht null ist)
Bei einem NULL-Objekt unterscheidet sich der Code geringfügig. Wir können nicht << auf UserInfo aufrufen, da es NULL ist. Wir müssen eine Zuweisung vornehmen (siehe auch Objekt-Boolean-Auswertung):
/* an example with a null object (def does not implies Map type) */
def userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
Und mit einer Nullkarte:
/* The same example with a null Map */
Map<String,String> userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
Objekt boolesche Auswertung
Eine NULL-Objektreferenz wird mit "false" ausgewertet, eine nicht-NULL-Referenz auf "true". Bei Zeichenfolgen, Sammlungen, Iteratoren und Aufzählungen wird jedoch auch die Größe berücksichtigt.
def m = null
if (!m)
println "empty"
else
println "${m}"
wird "leer" drucken
def m = [:]
if (!m)
println "empty"
else
println "${m}"
Die Map ist nicht null, aber leer. Dieser Code wird "leer" gedruckt.
Nachdem
m << ['user' : 'Groot' ]
Die Karte wird gedruckt:
[user:Groot]
Überschreiben der booleschen Bewertung in einer benutzerdefinierten Klasse
Manchmal kann es nützlich sein, eine bestimmte asBoolean-Definition in Ihrem eigenen Programm für bestimmte Objekte zu haben.
/** an oversimplified robot controller */
class RunController {
def complexCondition
int position = 0
def asBoolean() {
return complexCondition(this);
}
def advanceTo(step) {
position += step
}
}
def runController = new RunController(complexCondition : { c -> c.position < 10 } )
assert runController
runController.advanceTo(5)
assert runController
runController.advanceTo(5)
// The limit has been reached : the controller evaluates to false
assert !runController
Dieser Code zeigt eine zu stark vereinfachte Robotersteuerung, die überprüft, dass die Position des Roboters 10 nicht überschreitet (mit einer Schließung für die Zustandsbewertung).
Charakterbewertung
Ein Zeichen ergibt den Wert "true", wenn der Wert nicht Null ist
assert ! new Character((char)0)
assert ! new Character('\u0000Hello Zero Char'.charAt(0))
assert new Character('Hello'.charAt(0))
Matcher-Bewertung
Ein Matcher wird mit "true" ausgewertet, wenn mindestens eine Übereinstimmung gefunden wird
// a match is found => true
assert 'foo' =~ /[a-z]/
// the regexp does not match fully => no match => false
assert !( 'foo' ==~ /[a-z]/ )
// a match is found => true
assert 'foo' =~ /o/
// no match => false
assert !( 'foo' =~ /[A-Z]/ )
Schließungsbewertung
Die Bewertung einer Schließung ist die Bewertung des Schließungsergebnisses.
Es gelten alle Regeln: Wenn der Abschluss eine Null, eine Null oder eine leere Zeichenfolge, Sammlung, Zuordnung oder ein Array zurückgibt, wird er als falsch ausgewertet, ansonsten als wahr.
// Closure return non zero number => true
assert { 42 }()
// closure returns 0 => false
assert ! ( { 0 }())
// closure returns null => false
assert !( { }())