Подтвердить что ты не робот

Groovy Истина: строка для булевой несогласованности?

В groovy:

println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false

Может ли кто-нибудь прояснить это поведение?

4b9b3361

Ответ 1

Обе эти

println 'test'.toBoolean() //false
println new Boolean('test') //false

создать экземпляр java.lang.Boolean с помощью конструктора, который принимает один аргумент String. Согласно javadocs, правило таково:

Выделяет логический объект, представляющий значение true, если строковый аргумент не равен нулю и равен (без учета регистра) строке "true". В противном случае выделите логический объект, представляющий значение false.

В обоих вышеупомянутых случаях строка не соответствует значению true (без учета регистра), поэтому созданное логическое значение имеет значение false.

В отличие от этого 'test' as Boolean следует правилам языка Groovy для приведения к логическому, что позволяет писать:

if ('hello') {
    println 'this string is truthy'
}

Для строки правило состоит в том, что если оно пустое или равно нулю, оно принимает значение false, в противном случае - значение true.

Я согласен, что это может считаться немного противоречивым, но учитывая выбор между согласованностью с создателем java.lang.Boolean и полезностью, я думаю, что они были правы, выбирая последнее.

Ответ 2

Дон прав в этом:

'test' as Boolean следует правилам языка Groovy для принуждения к логическому значению

который также известен как "Groovy истина".

Но String.toBoolean() в Groovy не просто создает логическое значение со строкой в ​​качестве аргумента. Из groovy api docs на String.toBoolean():

String.toBoolean() Преобразует данную строку в объект Boolean. Если обрезанная строка имеет значение "true", "y" или "1" (игнорируя регистр), тогда результат будет истинным, иначе он будет ложным.

Несколько хороших примеров для строк и их преобразования с помощью toBoolean():

assert "y".toBoolean()
assert 'TRUE'.toBoolean()
assert '  trUe  '.toBoolean()
assert " y".toBoolean()
assert "1".toBoolean()

assert ! 'other'.toBoolean()
assert ! '0'.toBoolean()
assert ! 'no'.toBoolean()
assert ! '  FalSe'.toBoolean()

Ответ 3

Булевский конструктор берет строку, которую вы ей дали, и запускает метод toBoolean() в этой строке. В двух словах все, что он не может проанализировать как действительное логическое значение, считается ложным. Или, другими словами, истинно только "истина".

Ответ 4

Я бы сговорился с аргументом @cdeszaq о конструкторе, и, насколько ваш первый пример созерцается, я бы сказал, что он просто отбрасывает его на bool. Пока указатель не равен нулю, это будет верно. Я полагаю, что .toBoolean() фактически пытается проанализировать его значение объекта. Рассмотрите возможность выполнения 'true'.toBoolean() и '1'.toBoolean(), чтобы увидеть, что они возвращают.

Я никогда не слышал о Groovy перед этим вопросом, это может быть неверно.

Ответ 5

Однако при применении к другим объектам возникает несогласованность:

int i = 0
String s = 'abc'

if (s)
    println  is true' // will be printed

if (i) 
    println ' i "is true" ' // will not be printed

(Groovy 1.7.8)

Вы должны быть явным во втором, если if (i!= null) или if (i!= 0)

Некоторые ошибки можно отслеживать для проверки непустого целого числа, используя if (i).