2010-10-11 3 views
0

Следующая Groovy сниппет производит странные результаты мне:Ошибка Groovy split()?

def s = "123456" 
assert s.split("").size() == s.size() 

Результаты в:

Assertion failed: 

assert s.split("").size() == s.size() 
     | |   |  | | | 
     | |   7  | | 6 
     | |    | 123456 
     | |    false 
     | [, 1, 2, 3, 4, 5, 6] 
     123456 

Есть ли что-то я пропустил на разъемной) поведение метода (или это реальная ошибка?

+0

Я использую последнюю версию Groovy (1.7.5) – Philippe

+1

Это то же самое поведение, что и в Java –

+0

@tim_yates: yup, см. Мой ответ. –

ответ

5

Я не знаком с Groovy, но я собираюсь выйти на конечности здесь, и думаю, что String.split() работает точно так же, как это делает в Java. Это означает, что аргумент, который вы передаете в split(), представляет собой строку, которая представляет собой регулярное выражение - в данном случае пустую строку. В соответствии с the Java docs:

Этот метод работает, как если путем вызова двух аргументов split метод с данным выражением и предельного аргумента нулю. Поэтому конечные пустые строки не включаются в результирующий массив.

Это означает, что вызов split("") (например, «разделение на пустую строку») эквивалентно split("", 0). Каждая (непустая) строка начинается и заканчивается пустой строкой. Таким образом, ваш звонок split("") на самом деле дает вам [, 1, 2, 3, 4, 5, 6, ], минус завершающие пустые строки, следовательно, [, 1, 2, 3, 4, 5, 6].

+0

Большое спасибо за объяснение. Вот что мне здесь не хватает. – Philippe

4

Почему вы используете split()? Используйте toCharArray():

assert s.toCharArray().length == s.size() 
Смежные вопросы