Другой, более кросс вариант говор, должен помнить, что интервалы коллекции тоже (я нахожу это более функциональный а).
| sequence |
sequence = #('I' 'invented' 'the' 'term' 'Object' 'Oriented' 'Programming' 'and' 'this' 'is' 'not' 'it').
(1 to: sequence size by: 2) collect: [:n | sequence at: n]
вернется:
#('I' 'the' 'Object' 'Programming' 'this' 'not')
Но может быть легко изменен, чтобы вернуть
#('invented' 'term' 'Oriented' 'and' 'is' 'it')
простой заменой ведущего 1
для 2
. Что приятно, так это то, что вы можете нарезать его любым способом. Если на вашем диалекте есть параCollect :, вы можете использовать его только для смежных элементов. Вы не можете получить каждое третье слово, начиная два сзади в обратном порядке:
(sequence size - 1 to: 1 by: -3) collect: [:n | sequence at: n]
"returns"
#('not' 'and' 'Object' 'invented')
Я считаю, что с помощью последовательности в качестве среза итератора для collect:
является гораздо более полезной и общей схемой использования.
Часть блока между ** [** и ** | ** зарезервирована для аргументов, передаваемых в блок. Кроме того, сообщение 'whileTrue:' оно ожидает блок, который не принимает аргументов. Выражение 'x: = x + 2' принадлежит правую часть ** **. Затем подумайте о том, в каком порядке вы используете ** x ** в качестве индекса и приращения ** x **. Возможно ли, что ** x ** будет превышать размер вашей коллекции до сообщения 'self at: x'? –