Groovy Truth: строка в логическое несоответствие? - PullRequest
28 голосов
/ 19 января 2012

In groovy:

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

Кто-нибудь может прояснить это поведение?

Ответы [ 5 ]

34 голосов
/ 19 января 2012

Оба эти

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

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

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

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

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

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

Для строки правило состоит в том, что, если оно пустое или нулевое, оно оценивается как ложное, в противном случаеtrue.

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

17 голосов
/ 27 сентября 2012

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

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

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

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

String.toBoolean() Преобразует данную строку в логический объект. Если обрезанная строка имеет значение «истина», «у» или «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()
0 голосов
/ 23 апреля 2013

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

int i = 0
String s = 'abc'

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

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

(Groovy 1.7.8)

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

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

0 голосов
/ 19 января 2012

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

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

0 голосов
/ 19 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...