【问题标题】:Returning messages in Smalltalk在 Smalltalk 中返回消息
【发布时间】:2010-03-08 06:33:19
【问题描述】:

我有一个我在 smalltalk 中创建的对象字典,我通过基于键/值对枚举它来迭代它。

对于字典中的值对象,我在该对象上调用一个方法。基于某些条件,我希望这个对象能够向字典中添加一个新成员,并可能删除另一个。

我一直在查看 Smalltalk 中的“执行”和“消息”功能,但我不确定是否可以做我想做的事情 - 是否可以返回消息(或多条消息),另一个对象可以处理和执行哪个?

例如,我的方法能否同时返回“removeKey: 19”和“添加对象”?

如果重要的话,我正在使用 GNU Smalltalk。

【问题讨论】:

    标签: smalltalk


    【解决方案1】:

    当您遍历集合时,将集合作为参数的一部分传递:

    aCollection copy do: [:each | each doSomethingOn: aCollection]
    

    副本确保#doSomethingOn: 可以更改原始集合而不会弄乱迭代。

    【讨论】:

      【解决方案2】:

      Smalltalk 方法不能返回多个值,但它可以返回包含这些值的 Collection:

      foo
        ^ Array with: 1 with: 2.
      

      所以你返回一个包含多个方法的集合,然后迭代它,在集合中发送消息。

      【讨论】:

        【解决方案3】:

        类 Message 可以做你想做的事:

        (Message selector: #raisedTo: argument: 2) sendTo: 3
        

        评估时产生“9”。

        注意,在对集合进行迭代时添加或删除内容通常不是一个好主意。尝试先复制集合,迭代副本并从用于迭代副本的块中修改原始集合。

        【讨论】:

          【解决方案4】:

          在迭代时,将要添加的项目添加到 aDictionary、aTemporaryDictionaryOfAdds 和要删除的项目到 aTemporaryDictionaryOfDeletes

          然后遍历其中的每一个,像你一样在字典中添加和删除。

          如果您将删除添加到 aDictionaryOfThingsDeletedFromADictionary,那么您也有历史记录。

          【讨论】:

            猜你喜欢
            • 2010-10-27
            • 2019-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多