【问题标题】:In Squeak, how to wrap every method send?在 Squeak 中,如何包装每个发送方法?
【发布时间】:2009-05-20 16:17:43
【问题描述】:

我创建了一个类,在该类中我有一个方法'sendMessage: to: withArgs:',它接收一个对象、一个消息和一个参数数组。 该方法用于向对象发送消息并执行一些算法。 要使用此方法,我必须创建我创建的类的实例 x 并执行 x sendMessage: '+' to: '7' withArgs: '#(5)' 之类的操作。 使用参数 5 向对象 7 发送消息“+”的结果,以及我的算法所做的一些事情。但我想要的是该算法将在每个方法调用中使用,这意味着 7+5 将调用我的'sendMessage: to: withArgs:'。 我怎样才能做到这一点?或者至少,在发送给每个对象的每个方法中是否调用了某些东西?

【问题讨论】:

    标签: smalltalk squeak object-model


    【解决方案1】:

    这有点好笑,我们刚刚在 Squeak irc 频道中讨论过这个问题。或许可以看看 ObjectViewer。

    在您的示例中,您希望拦截发送到 SmallInteger 的消息。有趣的是,ObjectViewer 几乎适用于所有类,但 SmallInteger 除外。

    因此,要拦截发送到 myObject 的消息,请执行此操作。

    创建类 Intercepter,让它继承自 ObjectTracer,也许。将 doesNotUnderstand 更改为对您有用的内容:

    doesNotUnderstand: aMessage
       "do Mojo to aMessage as you describe it"
    

    然后,为了让您的工作顺利进行,请创建您的拦截器:

    myIntercepter := Intercepter on: myObject.
    

    然后

    myObject become: myInterceptor.
    

    【讨论】:

      【解决方案2】:

      在 Squeak 中,请参阅 ObjectTracer 类。类注释描述了如何使用它。你应该能够用它来完成你所需要的,或者至少将它用作模型。

      【讨论】:

        【解决方案3】:

        看看the Reflectivity

        不幸的是,一些论文链接不起作用,我不记得从头顶发出的确切调用,但是根据需要检测代码真的很容易,甚至可以在运行时进行。使用 Link 类查找示例。

        【讨论】:

          【解决方案4】:

          您可以使用方法包装器。要查看方法包装器是什么,您可以查找一篇名为“Wrappers to the rescue”的论文。我认为有一个已经实现方法包装器的 squeak 包。 此外,您可以看到在最新版本的 Pharo 中如何进行测试代码覆盖分析,因为它使用一种方法包装器来查看在测试运行期间评估了哪些方法。 干杯, 加博托

          【讨论】:

            猜你喜欢
            • 2016-02-23
            • 2012-07-06
            • 1970-01-01
            • 1970-01-01
            • 2020-12-13
            • 1970-01-01
            • 1970-01-01
            • 2016-07-14
            • 1970-01-01
            相关资源
            最近更新 更多