如何在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
相关产品推荐
相关产品推荐

