You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pharo中重写方法自定义调试器/检查器的对象显示

在Pharo中自定义类在调试器/检查器的紧凑显示方案

嘿,我之前也折腾过这个问题!要让你的自定义类像Integer、String那样在调试器和检查器里直接展示关键信息,不用点开新窗口,其实只需要重写几个特定的实例方法就行,不用去碰元类或者乱试一堆方法,我给你一步步讲:

核心方法1:重写printOn:

这是控制对象默认字符串表示的基础方法,调试器和检查器的默认显示都会依赖它。比如你有个带name和score的Student类,重写后可以直接把关键属性嵌到显示文本里:

Student >> printOn: aStream
    super printOn: aStream. "保留默认的类标识,比如`a Student`"
    aStream nextPutAll: ' (name: ', name asString, ', score: ', score asString, ')'

这样在检查器顶部或者调试器的变量预览里,就会显示a Student (name: Bob, score: 92),不用点开就能看到核心数据。

核心方法2:重写displayString(更紧凑的变量列表显示)

如果你想让调试器的变量列表里直接显示更简洁的描述(比如代替默认的a Student),可以重写displayString方法:

Student >> displayString
    ^ name, ' (', score asString, ')'

这样变量列表里的这个对象就会直接显示Bob (92),完全不用额外操作就能快速识别。

避坑提醒

  • 千万别去重写class方法!你之前遇到的问题就是因为碰了元类相关的内容,这完全没必要,而且会破坏系统的元结构。
  • printOn:是基础,displayString是锦上添花的优化,优先实现前者,再根据需要加后者。
  • 如果需要更定制化的检查器视图(比如添加自定义分组),可以扩展Inspector的相关方法,但对于“紧凑显示内部变量”的需求,上面两个方法就足够了。

举个完整的实用例子,比如一个TodoItem类:

TodoItem >> printOn: aStream
    super printOn: aStream.
    aStream
        nextPutAll: ' [', title, ']';
        nextPutAll: (isCompleted ifTrue: ' ✅' ifFalse: ' ⏳')

TodoItem >> displayString
    ^ title, ' ', (isCompleted ifTrue: '[✅]' ifFalse: '[⏳]')

这样在调试器里,变量列表会直接显示Buy groceries [⏳],检查器顶部会显示a TodoItem [Buy groceries] ⏳,完美实现你要的紧凑、直观的视图,不用再开新窗口啦!

内容的提问来源于stack exchange,提问作者J3STER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:57:28