Smalltalk 有什么方法可以先枚举一个对象,然后再枚举一个集合吗?

Smalltalk 有什么方法可以先枚举一个对象,然后再枚举一个集合吗?,smalltalk,Smalltalk,是否有任何Smalltalk方言实现了 Object >> #andThen: aCollection do: aBlock self value: aBlock. aCollection do: aBlock 我问这个问题的原因是,这种模式随处可见,我总是花时间考虑是否创建一个新集合,然后#do:,或者是否为了效率而在客户端内联代码 更新 下面是元素不在集合中的情况示例 您有一个字符串列表和标题: FOOD nuts apples seeds beans tom

是否有任何Smalltalk方言实现了

Object >> #andThen: aCollection do: aBlock
  self value: aBlock.
  aCollection do: aBlock
我问这个问题的原因是,这种模式随处可见,我总是花时间考虑是否创建一个新集合,然后#do:,或者是否为了效率而在客户端内联代码

更新

下面是元素不在集合中的情况示例

您有一个字符串列表和标题:

FOOD
 nuts
 apples
 seeds
 beans
 tomatoes
 algae
 mushrooms
 sprouts
你正试图和他们做些什么。假设您想要计算最大宽度,或者您想要在屏幕上显示它们,等等

标题不属于集合中,但对于我们想做的一些操作,我们需要同时考虑标题和项目。

这是什么?

{ self }, aCollection do: aBlock
您还可以更明确地说明这一点:

(aCollection copyWithFirst: self) do: aBlock

如果食品是词典条目及其相关收藏的关键呢?

现在是了——谢谢。 只需稍作修改,即使用对称实现

>>andThen: anotherObject do: a1block
    self do: a1block.
    ^anotherObject do: aCollection

最初的问题是:“这是个好主意吗?”
并给出了一些代码

是的,这是个好主意,但有一个打字错误。
因为第二行写反了

这是一个正确的版本。
(只是纠正了原问题中的拼写错误)



下一步:

我先前的回答也有错。
需要更好的评论

这是一个修正版(9/11/16的答案)

注:以上取决于另一个定义,
可能不在您的图像中。

对象还需要定义#do:,如下所示

Object>>do: a1block
    ^a1block value: self

根据您使用的集合类型(即可增长的集合,如<代码>有序集合>代码>,您也可以考虑<代码>(Acclipse Addio:自已):AbLoo< <代码>。不同之处当然是,您不创建集合的副本。托拜厄斯的答案更一般。@ MasLekes和托拜厄斯。在这两种情况下(比如,
Array
OrderedCollection
)代码需要做的事情不仅仅是评估元素的锁定。就像数学家冷却水然后应用上一个过程的笑话一样。请注意,
#copyWithFirst:
将产生修改集合的副作用,这在许多情况下可能是不好的。事实并非如此原始集合不会被修改。迭代会在原始集合的副本上使用额外的插槽。但是,它会复制集合,可能会影响性能并生成垃圾。我更想知道为什么该对象不是集合的一部分,因为它显然必须具有类似的类型and必须处理相同的操作。@MaxLeske感谢您的评论。我添加了一个示例。谢谢,这很有意义。我担心这不会解决这个问题,因为您仍然需要使用键然后使用关联的集合来计算
aBlock
,它完全复制了我试图在一个方法中捕获的模式。哈!您是一个是的。
self-value:aBlock
没有任何意义。我应该写
aBlock-value:self
。很好,谢谢!
"
 This version also works for
   any combination of parameters,
   and in any order.
" 
>>andThen: anotherObject do: a1block
    self do: a1block.
    ^anotherObject do: a1block
Object>>do: a1block
    ^a1block value: self