Groovy Правдивый вопрос: String.split () создает пустой массив, но имеет ли значение true? Как? - PullRequest
1 голос
/ 19 февраля 2020

Ниже приведен ряд шагов, которые я предпринял в оболочке sh. Оболочка демонстрирует проблему

String.split() => String[], как и ожидалось в Java SDK. Когда я оцениваю это как часть продолжающегося выражения: changedDirs.split('\r\n').collect{ ... } my collect выполняется 1 раз с пустым it. Позвольте мне допустить: этот код работает на сервере Jenkins, и, как известно, Jenkins, например, имеет диалект из groovy. Но, независимо от того, когда я тестирую его локально с помощью groovysh, я действительно получаю то, чего не ожидал: [] оценивается как truthy , если это происходит от String.split()

Итак: может кто-нибудь объяснить:

  1. Как этот groovy код, приведенный ниже, производит truthy для String.split(), а не для основы c empty []
  2. Дженкинс делает что-то странное?
groovy:000> [] ? 'true' : 'false'
===> false
groovy:000> changedDirs = ''
===> 
groovy:000> changedDirs.split('\r\n')
===> []
groovy:000> changedDirs.split('\r\n') ? true : false
===> true
groovy:000> result = changedDirs.split('\r\n')
===> []
groovy:000> result ? true : false
===> true
groovy:000> result.class
===> class [Ljava.lang.String;
groovy:000> [] as String[] ? true : false
===> false
groovy:000> 

1 Ответ

4 голосов
/ 19 февраля 2020

result оценивается как true как логическое значение, поскольку changedDirs.split('\r\n') создает массив String[] с одним элементом - пустой строкой. Взгляните на следующий пример:

groovy:000> ([] as String[]).class
===> class [Ljava.lang.String;
groovy:000> ([] as String[]) ? true : false
===> false
groovy:000> x = ([] as String[])
===> []
groovy:000> x.dump()
===> <[Ljava.lang.String;@5c41d037>
groovy:000> y = "".split(",")
===> []
groovy:000> y.class
===> class [Ljava.lang.String;
groovy:000> y.dump()
===> <[Ljava.lang.String;@79a1728c>
groovy:000> y ? true : false
===> true
groovy:000> y.length
===> 1
groovy:000> x.length
===> 0
groovy:000> y[0].dump()
===> <java.lang.String@0 value= hash=0>
groovy:000> 

В "Groovy Truth" каждый непустой массив оценивается как true при вызове asBoolean() метода, независимо от значения элементы в массиве.

Если вы посмотрите на следующий пример кода Java, вы увидите, что метод String.split(pattern) создает массив из одного элемента в случае пустой строки.

final class Test {

    public static void main(String[] args) {
        String[] array = "".split("\r\n");

        System.out.println(array.length); // prints: 1
    }
}

Этот вопрос SO может быть полезен - Почему «split» на пустой строке возвращает непустой массив?

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