Как очистить загроможденное рабочее пространство в Pharo?

#smalltalk #pharo #erase

#smalltalk #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, не получив сначала jpg с помощью ZnEasy), и несколько изображений маяка (так как каждый раз, когда я открываю инспектор, генерируется новое).).

Я говорю «правильно очистить», потому что вы можете просто выйти из 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:}
 

Я также попытался выполнить сбор мусора и просто щелкнуть изображения и нажать Удалить.

Ответ №1:

Открыв их в раздаче, вы разместили их в мире. Если вы осмотрите мир, вы увидите, что существует несколько форм изображений. Вы хотите исключить логотип Pharo. Если вы проверите это, его расширение сообщит вам, что логотип заблокирован.

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

Ответ №2:

Другой способ, который в данном случае не так практичен, но уникален для smalltalk, заключается в использовании #allInstances . Вы можете сделать

 ImageMorph allInstances inspect
 

который возвращает все эти изображения. затем вы можете отправить их в необработанном виде инспектора #delete . Здесь это не так практично, поскольку значки в окнах также являются формами изображений, поэтому вы получите длинный список

Ответ №3:

Основываясь на вышесказанном, я использовал Playground для проверки субморфов мира. Это позволяет идентифицировать нежелательные изображения. Затем я использовал (work SubMorphs at: n) delete, чтобы удалить их по отдельности. Вам необходимо отслеживать индексы, поскольку они могут меняться при каждом удалении изображения.

Ответ №4:

Чтобы найти все сообщения, которые поймет объект, взгляните на его класс и на его суперклассы. delete В Morph классе вы найдете суперкласс ImageMorph .

Попробуйте выполнить это построчно:

 | 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.
 

Комментарии:

1. Спасибо, но я думаю, что эта процедура применима только к текущему морфингу. Если было создано несколько морфов без отправки delete в конце, я думаю, что впоследствии невозможно будет использовать delete таким образом.