如何清理 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。你会在Morph
class中找到delete
,ImageMorph
的超级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 来单独删除它们。您需要跟踪索引,因为每次删除图像时它们可能会发生变化。
在 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。你会在Morph
class中找到delete
,ImageMorph
的超级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 来单独删除它们。您需要跟踪索引,因为每次删除图像时它们可能会发生变化。