2015-04-08 2 views
8

Я столкнулся с чем-то странным, когда делал некоторые данные с помощью тестирования в Groovy. Если это имеет значение, это находится в тесте Spock.Что это за конструкция Groovy, и как работает синтаксис?

Вот так, я думаю, что списки должны работать:

def list = [[1, 2, 3], 
       [4, 5, 6], 
       [7, 8, 9]] 

    println list[0] 

производит:

[1, 2, 3] 

я случайно сделал что-то вроде этого:

def whut = [[1, 2, 3] 
       [4, 5, 6] 
       [7, 8, 9]] 

    println whut[0] 
    println whut 

который выходы:

[null, null, null] 
[[null, null, null]] 

ОК, я вижу, что Groovy не понравилось объявление без запятых, но оно компилируется, так что это?

Вот что на самом деле бросает мне об этом синтаксисе:

def inputz = [ 
      [1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243] 
      [1, 0.312284518, 0.312284518, 0.312284518, 1, 1, 1   ] 
      [3, 0.823506476, 0.31230335, 0.631237191, 1, 1, 0   ] 
      [4, 0.934875788, 0.486395986, 0.66732053, 3, 2, 0.927654169] 
      [4, 0.699869773, 0.234328294, 0.424739329, 3, 3, 1   ] 
    ] 

    println inputz[0] 
    println inputz 

дает следующее:

[0.631226308, 1, 1, 1, 1, 1, 1] 
[[0.631226308, 1, 1, 1, 1, 1, 1]] 

Я полностью потерял здесь - то, что это Groovy конструкт я создаю, и почему выводит эти, казалось бы, случайные значения из моих списков?

Спасибо, и если вы думаете о более описательном имени для моего вопроса, я его изменю.

+0

Мы использовали этот удивительный вопрос в качестве головоломки во втором сезоне #groovypuzzlers и хотим отправить вам футболку с благодарностью. Как я могу связаться с вами? – JBaruch

ответ

9

Так

def whut = [[1, 2, 3] 
      [4, 5, 6] 
      [7, 8, 9]] 

Создает список [1,2,3], получает доступ к элементам 4, 5 и 6 (которые не существует), чтобы дать вам список из трех нулямов, затем обращаются элемент 7,8 и 9 этот список нуляма (опять три Нуль- вернулось)

затем он оборачивает этот список из трех нулей в списке

в этом примере:

[1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243] 
[1, 0.312284518, 0.312284518, 0.312284518, 1, 1, 1   ] 
.... 

он сверлит вниз:

[1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243] 
[1, 0, 0, 0, 1, 1, 1] 

Чтобы дать 1-й, 0th, 0th, 0th, 1-й, 1-й и 1-й и заканчивается

[0.631226308, 1, 1, 1, 0.631226308, 0.631226308, 0.631226308] 

так далее и так далее.

+0

Это было бы гораздо более очевидным, если бы я не работал над проблемой вероятности 0-1. Спасибо за ваше хорошо написанное объяснение. – orbfish

6

Ломая это вниз в меньший пример (groovysh):

> [[1,2][3,4]] 
===> [[null, null]] 

Но нам не нужен дополнительный массив, так что мы можем разворачивать это:

> [1,2][3,4] 
===> [null, null] 

Это на самом деле вид списка индексации, которая обычно выглядит следующим образом:

> [1,2][1] 
===> 2 

Но если показатель с конца массива:

> [1,2][2] 
===> null 

Оказывается, заводные поддерживает нарезку как часть этого синтаксиса (см http://groovy-lang.org/groovy-dev-kit.html#Collections-Slicingwiththesubscriptoperator для большего количества примеров), так что мы можем сделать:

> [1,2,3][2,0] 
===> [3, 1] 

Чтобы получить 3-й элемент, затем первым элементом.

Но сочетающие эти два факта:

> [1,2][3,4] 
===> [null, null] 

Мы индексировать мимо конца массива снова, но с кусочком, что дает нам два аннулирует.

+0

2 отличных ответа, хотелось бы проверить оба! – orbfish

Смежные вопросы