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 !( { }())


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow