В groovy:
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
Может ли кто-нибудь прояснить это поведение?
В groovy:
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
Может ли кто-нибудь прояснить это поведение?
Обе эти
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
и полезностью, я думаю, что они были правы, выбирая последнее.
Дон прав в этом:
'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()
Булевский конструктор берет строку, которую вы ей дали, и запускает метод toBoolean()
в этой строке. В двух словах все, что он не может проанализировать как действительное логическое значение, считается ложным. Или, другими словами, истинно только "истина".
Я бы сговорился с аргументом @cdeszaq о конструкторе, и, насколько ваш первый пример созерцается, я бы сказал, что он просто отбрасывает его на bool. Пока указатель не равен нулю, это будет верно. Я полагаю, что .toBoolean()
фактически пытается проанализировать его значение объекта. Рассмотрите возможность выполнения 'true'.toBoolean()
и '1'.toBoolean()
, чтобы увидеть, что они возвращают.
Я никогда не слышал о Groovy перед этим вопросом, это может быть неверно.
Однако при применении к другим объектам возникает несогласованность:
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).