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