#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 таким образом.