【问题标题】:Change the way an object is displayed in debugger/inspector variable-value table更改对象在调试器/检查器变量值表中的显示方式
【发布时间】:2020-01-19 15:54:20
【问题描述】:

我想知道是否有可以在 Pharo 中覆盖的消息,以便我的自定义类在检查器/调试器中显示更多描述性信息,就像简单的变量类型(如整数或字符串)一样。例如:

而不是那样,我希望它显示一个包含其内部变量的更自定义和信息丰富的描述,以便对变量有一个更紧凑/更整洁的视图,而不必单击它并打开另一个图表(因此丢失查看上一张图表上的信息)。我知道您可以增加下面显示的图表数量,但这不是问题的重点。我想实现这样的目标:

我浏览了 pharo 论坛,一无所获,我还尝试了覆盖 30 多种方法,希望其中一种方法改变了输出。只有class 消息似乎改变了输出,但我只能返回Metaclass 的一个实例,而且除了弄乱这条消息之外会破坏很多东西。最后,我尝试对调试器和检查器进行逆向工程,以查看在哪个点构建了表以及使用了哪些值或发送了哪些消息来构建所述值,但这对我来说太多了,调用堆栈不断增长并且我什至无法刮擦表面。

【问题讨论】:

    标签: debugging smalltalk pharo


    【解决方案1】:

    幸运的是,在任何 Smalltalk 中执行此操作都非常容易。从 Object 继承的类型预计会响应消息printString,并最终响应printOn: aStream。这些消息应该给出对象的描述。所以,你应该在你的类中覆盖printOn:printString 使用printOn:),所有的浏览器和检查器都会自动使用它。如果你想在不同的选项卡中提供更复杂的信息,Pharo 中还有其他可能性,但是我认为printOn: 对你来说就足够了。

    一个例子是:

    MyPoint>>printOn: aStream
        aStream nextPut: ${.
        x printOn: aStream.
        aStream nextPutAll: ', '
        y printOn: aStream.
        aStream nextPut: $}
    

    【讨论】:

      【解决方案2】:

      在 Smalltalk 中,每次您观察到不喜欢或不理解的内容时,您都会提出以下问题:哪个消息在这样做?

      在您的情况下,问题是:哪条消息创建了我随处可见的字符串a MyPoint

      接下来,要回答您的问题,您需要找到一个插入halt 的好地方,然后从那里进行调试,直到找到罪魁祸首。为此,只需找到能够重现问题并对其进行调试的最简单表达式。在您的情况下,操场中的右键单击命令就可以了。所以,

      1. 游乐场中写入并选择(MyPoint on: 14 and: -5) halt
      2. 右键单击并发出 Print it 命令(我假设您已经检查过此命令是否生成字符串 'a MyPoint')。
      3. 调试
      4. 复习#DoIt 的评估,得到答案
      5. 继续以这种方式在 IntoOver 之间交替进行,以确保您跟随结果到达目的地
      6. 最终您将实现Object >> #printString。宾果游戏!

      现在你可以打开一个系统浏览器看看这个方法,研究它是如何在不同的类中实现的,等等。你的调查应该告诉你,打印的最基本的消息是@ 987654327@。您可能还想看看其他实现者,以便更好地了解人们通常做什么。 (请记住,写好#printOn:s 是一种极简艺术)

      【讨论】:

      • 问题:停止是否等同于断点?因为我创建了一个断点,它打开了十几个窗口,好像有一些并行发生
      • 谢谢,我忘了做最后一部分。我确实覆盖了 printString ,它改变了打印它的行为,但在检查时没有改变演示文稿。现在我知道printOn 就是我要找的东西
      • @J3STER 关于您的问题,其他人应该回答。我不是 Pharo 用户,所以我不熟悉它对断点的支持。此外,这值得在 SO 中提出一个独立的问题。
      【解决方案3】:

      覆盖 printOn: 将适用于您只想更改描述的简单情况。
      Pharo 允许的远不止这些!
      由于我们检查器的可扩展(可模塑)特性,您无需重写方法即可获得自己的对象可视化。
      例如,看看这个数组可视化:

      这是在Collection添加这个方法得到的:

      gtInspectorItemsIn: composite
          <gtInspectorPresentationOrder: 0>
      
          ^ composite fastList
              title: 'Items';
              display: [ self asOrderedCollection ];
              beMultiple;
              format: [ :each | GTObjectPrinter asTruncatedTextFrom: each ];
              send: [ :result | 
                  result
                      ifNil: [ nil ]
                      ifNotNil: [ result size = 1
                              ifTrue: [ result anyOne ]
                              ifFalse: [ self species withAll: result ]
                          ]
                  ]
      

      如果您浏览gtInspectorPresentationOrder: 的发件人,您会看到图像中已经有很多特殊的可视化。
      您可以以这些为例说明如何创建自己的,完全适合您的需要:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-24
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 2015-06-24
        • 1970-01-01
        • 2012-12-05
        相关资源
        最近更新 更多