2017-01-24 3 views
4

Есть ли элегантный однострочный шрифт для копирования не более n элементов в коллекции?Как скопировать не более n элементов коллекции в Smalltalk?

Я считаю, пишу следующие громоздким:

limit := collection size min: n. 
copy := collection copyTo: limit 

Есть ли лучший способ?

Edit - а также немного сложнее проблема: копирование в большинстве в последних п элементов

+0

Я бы использовал '#first:' вместо '#copyTo:', потому что у него есть компаньон '#last:' – Tobias

ответ

6

Есть также поток сообщений:

'foobar' readStream next: 3. 
'foobar' readStream next: 10. 

В Squeak/Pharo использовать next:, он будет автоматически обрезает, когда не так много элементов доступны по запросу.

В других диалектах, таких как VW & Дельфин использует более явные nextAvailable:, чтобы избежать ошибок.

+0

Nice! aka.nice! В других диалектах, где '#next:' не может усекать, попробуйте '#peek:', что, вероятно, будет. –

+1

Ницца! к сожалению, это не работает для последнего. Мне любопытно, что Smalltalk не хватает много в области манипулирования строками и другими коллекциями (например, для python) – melkyades

+0

@melkyades Хороший вопрос. Я бы сказал, что большинство Smalltalkers предпочитают не заполнять базовые классы, такие как 'String' и т. Д., Со слишком многими методами. Если конкретный проект выиграет от некоторых расширений, он добавит их для собственного удобства. Вот что предложил Андрей Чис в [этом ответе] (http://stackoverflow.com/a/41833228/4081336). –

5

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

SequenceableCollection>>#copyAtMost: n 
^self first: (self size min: n) 

Тогда вы можете иметь:

не
collection := 1 to: 100. 
collection copyAtMost: 101 
5

Там нет специального сообщения, но почему бы не:

aCollection first: (aCollection size min: n) 

и

aCollection last: (aCollection size min: n)