2011-04-08 6 views
5

Soy nuevo en smalltalk y como todos los demás lenguajes de programación que he aprendido, intenté hacer un simple programa de "hello world". He aprendido que en Pharo/Squeak lo que haces es abrir una ventana de transcripción, mecanografiado siguiente código en la ventana de trabajo y luego pulsa 'Alt-d' para ejecutarlo:¿Cómo identificar de manera única una ventana de transcripción en Pharo/Squeak?

Transcript show: 'hello world'; cr.

Por lo entiendo, la línea significa enviar el mensaje "show" con el argumento "hola mundo" al objeto transcripción y como se esperaba, mi ventana de transcripción muestra ahora:

hello world

hasta ahora tan bueno, sin embargo, cuando abrió una segunda ventana de transcripción y volvió a ejecutar el código, encontré que ambas ventanas de transcripción ahora tienen ve:

hello world

Como si ambas ventanas de transcripción son identificados por el identificador "Transcripción". Esto es lo que me confundió porque habría pensado que las ventanas de transcripción deben ser "instancias" de la clase de ventana de transcripción. Por lo tanto, ¿no debería haber una forma única de identificarlos?

Respuesta

11

Esta es una pregunta complicada y excelente. Smalltalk tiene un gran diccionario donde se almacenan todos los globales. Globales son generalmente clases, pero puede haber cualquier objeto allí. Es solo un diccionario (clave/valor). Este gran diccionario del que estoy hablando se llama Smalltalk. Escribe "Smalltalk inspeccionar" y lo verás. Es la instancia única de la clase SmalltalkImage.

Entonces ... cuando en su código escribe MyClass esto se debe a que en "Smalltalk en: # MiClase" en el valor, usted tiene la clase. Pero también puedes hacerlo: Smalltalk at: #mariano put: 'mariano'. Entonces puedes escribir "mariano" en todas partes, y obtendrás la cadena "mariano".

La transcripción es así. En (Smalltalk at: #Transcript) se conserva la instancia única de Transcript. Lo cual, de hecho, puede no ser una instancia de una clase de Transcripción sino otra. En pharo, es instancia de ThreadSafeTranscript. Verifique esto:

ThreadSafeTranscript instanceCount -> 1 Transcripción abierta. Transcripción abierta. Transcripción abierta.

Y siempre tendrá una. Porque Transcript en sí es el MODELO. No es la vista La vista (las ventanas que se abren cuando abre una Transcripción) son instancias de PluggableTextMorph, cuyo modelo es la instancia única de Transcript. Verifique:

PluggableTextMorph instanceCount - >> 11 Transcripción abierta. Transcripción abierta. Transcripción abierta. PluggableTextMorph instanceCount - >> 14

Para más detalles, eliminar errores "Transcript open".

Cheers

+0

gracias por la respuesta detallada – oscarkuo

3

La transcripción es una variable global que contiene la instancia. Inspeccione para ver su clase y así ver cómo abrir otra ventana, a la que tendría una referencia local.

Cuestiones relacionadas