groovy
Groovy Truth (prawda)
Szukaj…
Uwagi
Groovy ocenia warunki w instrukcjach if , while i for w taki sam sposób jak Java dla standardowych warunków Java : w Javie musisz podać wyrażenie boolowskie (wyrażenie, które ma wartość logiczną), a wynik jest wynikiem oceny.
W Groovy wynik jest taki sam jak w Javie dla tych warunków (nie podano przykładów, jest to standardowa Java).
Inny mechanizm oceny prawdziwości przedstawiony w przykładach można podsumować jako:
- liczby: zero wskazuje na false, a zero na true.
- objects: odwołanie do obiektu o wartości NULL ma wartość false, a odwołanie do wartości NULL do wartości true.
- Znak: znak o wartości zerowej przyjmuje wartość false, w przeciwnym razie prawda.
- Łańcuch: łańcuch ma wartość true, jeśli nie jest zerowy i pusty, false jeśli zerowy lub pusty (dotyczy również GStrings i CharSequences).
- Kolekcje i mapy (w tym podklasy Lista , Mapa , Zestaw , HashSet ...): bierze również pod uwagę rozmiar, ocenia na prawdę, jeśli kolekcja nie jest pusta i nie jest pusta, fałsz, jeśli jest pusta lub pusta.
- Wyliczenia i iteratory oceniają na true, jeśli nie na zero, i są to jeszcze niektóre elementy (groovy ocenia hasMoreElements lub hasNext na obiekcie), false, jeśli jest pusty lub nie ma już więcej elementów.
- Matcher: matcher ocenia na true, jeśli istnieje co najmniej jedno dopasowanie, false, jeśli nie znaleziono dopasowania.
- Zamknięcie: zamknięcie ocenia ocenę wyniku zwróconego przez zamknięcie.
Metodę asBoolean można zastąpić w klasie zdefiniowanej przez użytkownika, aby zapewnić niestandardową ocenę boolowską.
Liczby wartości logicznej
w przypadku liczb zero przyjmuje wartość false, a zero - true
int i = 0
...
if (i)
print "some ${i}"
else
print "nothing"
wypisze „nic”
Łańcuchowa ocena logiczna
ciąg (w tym GStrings) zwraca wartość true, jeśli nie jest pusta i pusta, fałsz, jeśli jest pusta lub pusta
def s = ''
...
if (s)
println 's is not empty'
else
println 's is empty'
wypisze: „s jest pusty”
Kolekcje i mapy oceny boolowskiej
Kolekcje i mapy mają wartość true, jeśli nie jest pusta i pusta, oraz false, jeśli nie ma wartości pustej
/* an empty map example*/
def userInfo = [:]
if (!userInfo)
userInfo << ['user': 'Groot', 'species' : 'unknown' ]
doda user: 'Groot' , species : 'unknown'
jako domyślny userInfo, ponieważ mapa userInfo jest pusta (pamiętaj, że mapa nie ma tutaj wartości null)
W przypadku obiektu zerowego kod jest nieco inny, nie możemy wywoływać << na userInfo, ponieważ jest pusty, musimy wykonać przypisanie (patrz także ocena boolean obiektu):
/* an example with a null object (def does not implies Map type) */
def userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
I z zerową mapą:
/* The same example with a null Map */
Map<String,String> userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
Ocena boolowska obiektu
odwołanie do obiektu zerowego ma wartość false, odniesienie do wartości zerowej to prawda, ale w przypadku łańcuchów, kolekcji, iteratorów i wyliczeń uwzględnia również rozmiar.
def m = null
if (!m)
println "empty"
else
println "${m}"
wypisze „pusty”
def m = [:]
if (!m)
println "empty"
else
println "${m}"
Mapa nie jest pusta, ale pusta, ten kod wyświetli „pusty”
Po zrobieniu
m << ['user' : 'Groot' ]
wydrukuje mapę:
[user:Groot]
Przesłanianie oceny boolowskiej w klasie zdefiniowanej przez użytkownika
Czasami może być przydatne posiadanie określonej definicji asBoolean we własnym programie dla pewnego rodzaju obiektów.
/** 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
Ten kod pokazuje uproszczony sterownik robota, który sprawdza, czy pozycja robota nie przekracza 10 (z zamknięciem do oceny stanu)
Ocena postaci
Znak ocenia na prawda, jeśli jego wartość nie jest równa zero, fałsz, jeśli zero
assert ! new Character((char)0)
assert ! new Character('\u0000Hello Zero Char'.charAt(0))
assert new Character('Hello'.charAt(0))
Ocena Matchera
Matcher ocenia na true, jeśli może znaleźć co najmniej jedno dopasowanie, false, jeśli nie znaleziono żadnego dopasowania
// 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]/ )
Ocena zamknięcia
Ocena zamknięcia jest oceną wyniku zamknięcia.
Obowiązują wszystkie zasady: jeśli zamknięcie zwróci wartość zerową, zerową lub pusty ciąg, kolekcję, mapę lub tablicę, w przeciwnym razie wartość false.
// Closure return non zero number => true
assert { 42 }()
// closure returns 0 => false
assert ! ( { 0 }())
// closure returns null => false
assert !( { }())