Как скопировать не более n элементов коллекции в Smalltalk?


Существует ли элегантная однострочная копия не более n элементов в коллекции?

Я нахожу написание следующего громоздкого:

limit := collection size min: n.
copy := collection copyTo: limit
Есть ли лучший способ?

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

3 4

3 ответа:

Существуют также потоковые сообщения:

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

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

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

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

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

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

collection := 1 to: 100.
collection copyAtMost: 101

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

aCollection first: (aCollection size min: n)

И

aCollection last: (aCollection size min: n)