Поиск…


замечания

Groovy оценивает условия в if , while и для операторов так же, как Java для стандартных условий Java : в Java вы должны предоставить логическое выражение (выражение, которое оценивается как логическое), и результат является результатом оценки.

В Groovy результат такой же, как в Java для условий thoses (без примеров, это стандартная Java).

Другой механизм оценки достоверности, показанный примерами, можно резюмировать следующим образом:

  • numbers: нулевое значение оценивается как false, а не ноль - true.
  • objects: ссылка на нулевой объект оценивается как false, а не нулевая ссылка на true.
  • Символ: символ с нулевым значением оценивается как false, в противном случае - true.
  • String: строка оценивает значение true, если не null, а не пустое, false, если значение null или пустое (применяется также к GStrings и CharSequences).
  • Коллекции и карты (включая подклассы List , Map , Set , HashSet ...): также учитывает размер, вычисляет значение true, если коллекция не является нулевой и не пустой, false, если значение null или пустое.
  • Перечисления и итераторы оценивают значение true, если не null, и это еще несколько элементов (groovy оценивает hasMoreElements или hasNext на объекте), false, если null или не более элементов.
  • Matcher: совпадение вычисляет значение true, если существует хотя бы одно совпадение, если найдено ложное, если совпадение не найдено.
  • Закрытие: закрытие оценивает оценку результата, возвращаемого закрытием.

Метод asBoolean может быть переопределен в определенном пользователем классе для предоставления пользовательской логической оценки.

Булевая оценка чисел

для чисел нулевое значение оценивается как false, а не ноль - true

    int i = 0
...
    if (i)
        print "some ${i}"
    else
        print "nothing"

будет печатать "ничего"

Строковые булевские оценки

строка (включая GStrings) оценивает значение true, если не null и не пусто, false, если значение null или пустое

def s = ''
...
if (s) 
    println 's is not empty'
else
    println 's is empty'

напечатает: 's is empty'

Булевая оценка коллекций и карт

Коллекции и карты оценивают значение true, если не null, а не пустое и false, если значение null или пустое

/* an empty map example*/
def userInfo = [:]
if (!userInfo)
    userInfo << ['user': 'Groot', 'species' : 'unknown' ]

добавит user: 'Groot' , species : 'unknown' качестве пользовательской информации по умолчанию, поскольку карта userInfo пуста (обратите внимание, что карта здесь не равна нулю)

С нулевым объектом код немного отличается, мы не можем вызывать << on userInfo, потому что он имеет значение null, мы должны выполнить назначение (см. Также булевскую оценку объекта):

/* an example with a null object (def does not implies Map type) */
def userInfo = null
if (!userInfo)
    userInfo = ['user': 'Groot', 'species' : 'unknown' ]

И с пустой картой:

/* The same example with a null Map */
Map<String,String> userInfo = null
if (!userInfo)
    userInfo = ['user': 'Groot', 'species' : 'unknown' ]

Объектная логическая оценка

ссылка на нулевой объект оценивается как false, а не нулевая ссылка на true, но для строк, коллекций, итераторов и перечислений она также учитывает размер.

def m = null

if (!m)
    println "empty"
else
    println "${m}"

будет печатать "пустые"

def m = [:]

if (!m)
    println "empty"
else
    println "${m}"

Карта не является нулевой, но пустой, этот код будет печатать «пустой»,

После

m << ['user' : 'Groot' ]

он распечатает карту:

[user:Groot]

Переопределение булевой оценки в определенном пользователем классе

Иногда может быть полезно иметь конкретное определение типа буфера в вашей собственной программе для каких-либо объектов.

/** 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

В этом коде показан избыточный контроллер робота, который проверяет, что положение робота не превышает 10 (с закрытием для оценки состояния)

Оценка персонажа

Символ оценивает значение true, если оно не равно нулю, false, если ноль

assert ! new Character((char)0)
assert ! new Character('\u0000Hello Zero Char'.charAt(0))
assert  new Character('Hello'.charAt(0))

Оценка соответствия

Matcher вычисляет значение true, если он может найти хотя бы одно совпадение, false, если совпадение не найдено

// 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]/ )

Оценка закрытия

Оценка закрытия - это оценка результата закрытия.

Все правила применяются: если закрытие возвращает нулевое число, нулевое число или пустую строку, коллекцию, карту или массив, она вычисляет значение false в противном случае в значение true.

// 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow