我是Smalltalk的新手,我正在努力做一个非常简单的程序,以这种方式从多个集合中产生一个集合:
假设我有一套军械库,而且每个军械库都拥有自己的武器套装,我想要做的就是编写一个方法,返回一个集合,其中包含来自每个军械库的所有武器组合。
提前感谢您的帮助!
答案 0 :(得分:7)
尝试这样的事情:
armories inject: OrderedCollection new into: [:collection :armory |
collection addAll: armory weapons; yourself].
答案 1 :(得分:4)
我想通过提出这个解决方案来改善大卫的答案:
armories inject: OrderedCollection new into: [:allWeapons :armory |
allWeapons, armory weapons]
由于,
返回2个集合的连接。
现在还有一种更“流畅”的方式,而没有创建新的 OrderedCollection 。有一个名为fold:
或reduce:
或'reduceLeft:`的方法,它是函数式编程的概念。所以你可以这样做:
(armories collect: #weapons) fold: [allWeapons :weapons |
allWeapons, weapons]
所以armories collect: #weapons
会给你一系列武器。 fold:
获取第一个元素和第二个元素并对它们执行块。然后取一个结果和一个第三个元素,依此类推......
现在我知道的最佳解决方案是flatCollect:
。我确信它出现在pharo中,但可能会丢失其他基于smalltalk的语言。这与collect:
相同,但将结果展平为一级。所以你要做的就是:
armories flatCollect: #weapons
享受
答案 2 :(得分:1)
大卫的答案是经典的小屁股成语。在进行更复杂的组合时,您可能更喜欢基于流的方法:
OrderedCollection fromStream: [:allWeapons |
allWeapons nextPutAll: armories collect: [:armory | armory weapons]]