Smalltalk 跳过每隔一个数组元素

Smalltalk 跳过每隔一个数组元素,smalltalk,squeak,Smalltalk,Squeak,因此,我试图跳过其他元素,将它们输入到集合中。然后我将集合转换回数组并尝试返回它。不过我不确定出了什么问题 altElement | newColl x y | newColl:= OrderedCollection new. x := 1. [x <= self size ] whileTrue: [x := x + 2 | newColl add: (self at: x)]. y:= new

因此,我试图跳过其他元素,将它们输入到集合中。然后我将集合转换回数组并尝试返回它。不过我不确定出了什么问题

altElement

    | newColl x y |
    newColl:= OrderedCollection new.

          x := 1.
          [x <= self size ] whileTrue: [x := x + 2 |
        newColl add: (self at: x)].

        y:= newColl asArray.

        ^y
altElement
|纽科尔x y|
newColl:=OrderedCollection新建。
x:=1。
[x您可能想要
#pairsDo:
甚至
#pairscollet:

#(1 2 3 4 5 6 7) pairsCollect: [:a :b | b]. "=> #(2 4 6)"
您可能想要
#pairsDo:
甚至
#pairscollet:

#(1 2 3 4 5 6 7) pairsCollect: [:a :b | b]. "=> #(2 4 6)"

另一个更跨方言的变体是要记住,间隔也是集合(我发现这也更有用)

将返回:

#('I' 'the' 'Object' 'Programming' 'this' 'not')
但可以很容易地更改为返回

#('invented' 'term' 'Oriented' 'and' 'is' 'it')
只需将前导的
1
替换为
2
。不过,最棒的是,您可以按照自己的意愿对其进行切分。如果您的方言有pairscollet:,则只能将其用于相邻的项目。您不可能将每三个单词从后面以两个单词的倒序开始:

(sequence size - 1 to: 1 by: -3) collect: [:n | sequence at: n]
"returns"
#('not' 'and' 'Object' 'invented')

我发现使用序列作为切片迭代器来收集:
是一种更有用、更通用的模式。

另一个更跨方言的变体是,记住间隔也是集合(我发现这也更有用)

将返回:

#('I' 'the' 'Object' 'Programming' 'this' 'not')
但可以很容易地更改为返回

#('invented' 'term' 'Oriented' 'and' 'is' 'it')
只需将前导的
1
替换为
2
。不过,最棒的是,您可以按照自己的意愿对其进行切分。如果您的方言有pairscollet:,则只能将其用于相邻的项目。您不可能将每三个单词从后面以两个单词的倒序开始:

(sequence size - 1 to: 1 by: -3) collect: [:n | sequence at: n]
"returns"
#('not' 'and' 'Object' 'invented')

我发现使用序列作为切片迭代器来
收集:
是一种更有用、更通用的模式[和|是为传递到块中的参数保留的。此外,
whileTrue:
消息期望一个不带参数的块。表达式
x:=x+2
属于|的右侧。接下来,考虑使用x作为索引的顺序和x的增量。x是否可能l超过消息
self at:x
之前的集合大小[和|是为传递到块中的参数保留的。此外,
whileTrue:
消息期望一个不带参数的块。表达式
x:=x+2
属于|的右侧。接下来,考虑使用x作为索引的顺序和x的增量。x是否可能l超过消息
self at:x
之前的收藏大小?