如何清理 Pharo 中杂乱的工作空间?

How to clear a cluttered workspace in Pharo?

Pharo MOOC 中提出了一项挑战(第 2.15.2 节),其中包括获取电子邮件地址并获取关联的 Gravatar 图像,作为 Morph 对象。我能够通过 运行 操场上的以下代码做到这一点:

| url email |
email := 'stephane.ducasse@inria.fr'.
url := 'http://www.gravatar.com/avatar/', (MD5 hashMessage: email) hex asString , '.jpg'.
(ZnEasy getJpeg: url) asMorph openInHand.

现在的问题是,我不知道如何正确清理工作区中所有已下载的对象:

如你所见,现在我有来自 url 的图像(来自我之前的拙劣尝试 url asMorph openInHand 而没有首先使用 ZnEasy 获取 jpg)和几个灯塔图像(因为每次我打开检查器时都会生成一个新图像)。

我说正确清洁是因为您可以不保存就退出 Pharo,然后再次打开它以获得干净的工作区,但这可能并不理想。

到目前为止,我尝试检查创建的对象,发现它们是 ImageMorph 的实例。然后在相关的方法中我搜索了一些东西,包括“擦除”、“删除”、“删除”或“清除”,但找不到类似的东西。这些是 ImageMorph 的可用方法:

{ImageMorph>>#prepareForRotating. 
ImageMorph>>#grabFromScreen. 
ImageMorph>>#forwardDirection:. 
ImageMorph>>#adoptPaneColor:. 
ImageMorph>>#drawOnAthensCanvas:. 
ImageMorph>>#extent:. 
ImageMorph>>#setOptimalResizing. 
ImageMorph>>#form:. 
ImageMorph>>#shouldFlex. 
ImageMorph>>#forwardDirection. 
ImageMorph>>#resize:. 
ImageMorph>>#areasRemainingToFill:. 
ImageMorph>>#heading. 
ImageMorph>>#imageExport. 
ImageMorph>>#defaultImage. 
ImageMorph>>#rotationDegrees. 
ImageMorph>>#borderStyle:. 
ImageMorph>>#opacityString. 
ImageMorph>>#setDirectionFrom:. 
ImageMorph>>#rotationDegrees:. 
ImageMorph>>#borderWidth:. 
ImageMorph>>#isOpaque. 
ImageMorph>>#image:. 
ImageMorph>>#readFromFile. 
ImageMorph>>#drawOn:. 
ImageMorph>>#basicExtent:. 
ImageMorph>>#form. 
ImageMorph>>#withSnapshotBorder. 
ImageMorph>>#wantsRecolorHandle. 
ImageMorph>>#changeOpacity. 
ImageMorph>>#initialize. 
ImageMorph>>#addCustomMenuItems:hand:. 
ImageMorph>>#isOpaque:. 
ImageMorph>>#releaseCachedState. 
ImageMorph>>#color:}

我也试过执行 garbageCollect,只需单击图像并按 Delete。

要查找一个对象可以理解的所有消息,请查看它的 class 和它的 superclasses。你会在Morphclass中找到deleteImageMorph的超级class。

试着逐行执行:

| url email morph |
email := 'stephane.ducasse@inria.fr'.
url := 'http://www.gravatar.com/avatar/', (MD5 hashMessage: email) hex asString , '.jpg'.
morph := (ZnEasy getJpeg: url) asMorph.
morph openInHand.
morph delete.

将它们打开在手中后,您就已经在世界中定位了它们。如果您观察这个世界,您会看到有许多 ImageMorphs。您想要排除 Pharo 徽标。如果您检查它,它的扩展名会告诉您徽标已锁定。

World submorphs select: [ :m | 
    m class = ImageMorph and: [ 
    m isLocked not ] ] 
thenDo: [ :m | m delete ]

另一种方法,在这种情况下不太实用,但 smalltalk 独有,是使用 #allInstances。你可以做到

ImageMorph allInstances inspect

其中 returns 所有这些图像。在检查员的原始视图中,您可以发送它们 #delete。这里不太实用,因为 windows 中的图标也是 ImageMorphs,所以你会得到一长串

基于以上内容,我使用 Playground 检查了 World subMorphs。这使您可以识别不需要的图像。 然后我使用 (work SubMorphs at: n) delete 来单独删除它们。您需要跟踪索引,因为每次删除图像时它们可能会发生变化。