Dictionary 在pharo中取消堆叠词典

Dictionary 在pharo中取消堆叠词典,dictionary,smalltalk,pharo,Dictionary,Smalltalk,Pharo,我有一个像a Dictionary('CMFireAutomataModel'->a Dictionary('nbash'->193'nbFires'->851))这样的对象,我想有一个像Dictionary('nbash'->193'nbFires'->851) 我不知道如何“取消堆叠”第一本字典。假设您有一本字典,它的键是字符串,其值是数字或字典,具有相同的排序(即,键是字符串,值是dicts或数字)。我们想要的是一种将所有字符串键和数字“升级”或“取消堆叠”到母字典的方法 unstack:

我有一个像
a Dictionary('CMFireAutomataModel'->a Dictionary('nbash'->193'nbFires'->851))
这样的对象,我想有一个像
Dictionary('nbash'->193'nbFires'->851)


我不知道如何“取消堆叠”第一本字典。

假设您有一本
字典
,它的键是
字符串
,其值是
数字
字典
,具有相同的排序(即,键是字符串,值是dicts或数字)。我们想要的是一种将所有字符串键和数字“升级”或“取消堆叠”到母字典的方法

unstack: aDictionary
  | dict |
  dict := aDictionary class new.
  aDictionary keysAndValuesDo: [:k :v | | d |
    v isNumber
      ifTrue: [dict at: k put: v]
      ifFalse: [
         d := self unstack: v.
         dict addAll: d associations]].
  ^dict
请注意,我使用了
aDictionary类new
来确保该方法与同类的
字典(例如
IdentityDictionary
等)匹配


还要注意,该方法可以在任何类中使用。我没有把它放在
字典中,因为我认为这不够一般(即使这会使代码简化一点)

假设你有一个
字典,它的键是
字符串
,它的值是
数字
字典
(即,使用字符串键和数字值)。我们需要的是一种将所有字符串键和数字“升级”或“取消堆叠”到主词典的方法

unstack: aDictionary
  | dict |
  dict := aDictionary class new.
  aDictionary keysAndValuesDo: [:k :v | | d |
    v isNumber
      ifTrue: [dict at: k put: v]
      ifFalse: [
         d := self unstack: v.
         dict addAll: d associations]].
  ^dict
请注意,我使用了
aDictionary类new
来确保该方法与同类的
字典(例如
IdentityDictionary
等)匹配


还要注意,该方法可以放在任何类中。我没有把它放在
字典中,因为我认为这不够一般(即使这样会使代码简化一点)

不清楚你的问题的所有条件是什么。但是从表面上看,如果你原来的字典被称为
d
,那么你可以先做
d值
。太好了!这正是我所期望的!不清楚你的问题的所有条件是什么。但是从表面上看,如果你原来的字典被调用了d
d
,然后您可以先执行
d值。完美!这正是我所期望的!我不确定操作的目的是什么,但您的示例实现使用if语句而不是直接分派。(不要问-说)。相反,只需实现#unstackTo:aDictionary方法,对象将实现为no op,Dictionary将实现为将其所有键值对添加到提供的Dictionary。但正如我所说的,不清楚作者的意图,所以我不确定是否值得这么做。@IgorStasenko,我同意。不过请注意,我不想添加m
Object
Dictionary
的方法,因为操作过于特定于特定需求(问题中未解释)。更多的知识可能表明,首先不需要取消堆叠任何内容。(另请参见我答案的最后一句)我不确定操作的意图是什么,但是您的示例实现使用if语句而不是直接分派。相反,只需实现#unstackTo:aDictionary方法,对象将实现为no op,Dictionary将实现为将其所有键值对添加到提供的Dictionary。但正如我所说的,不清楚作者的意图,所以我不确定是否值得这么做。@IgorStasenko,我同意。不过请注意,我不想添加m
Object
Dictionary
的方法,因为操作过于特定于特定需求(问题中未解释)。更多的知识可能表明,首先不需要取消堆叠任何内容。(另请参见我答案的最后一句)