Buenas!
Tengo un inconveniente mientras hacía el TP0.
Cree los objetos necesarios. Luego quiero meterlos en un SortedCollection.
El primero me lo deja ingresar, pero al intentar agregar el segundo dice:
"Instance of ... did not understand #ifTrue:ifFalse:" ¿?
Luego lo probe con un test con números y funciona:
Las variables estan declaradas. No vuelve a entrar en en "ifTrue" por lo cual no le hace un new. Ya probe cambiando los nombres de variables. Tambien iniciandolo en el constructor (initialize).
¿Hay que tener en cuenta algo que no estoy viendo?
Gracias!
Hola, fijate si haciéndolo mas simple te funciona
En el initialize podes tener algo como:
initialize
movies:= OrderedCollection new.
y luego en
agregarPelicula: aMovie
movies add: aMovie.
Con esto te vas a evitar el if.
Saludos!
Tomas
Hola Brenda:
El problema está en el método add:
de la clase SortedCollection
. Si te fijás en su implementación en el System Browser, verás que recibe un parámetro y realiza una serie de comparaciones y operaciones sobre él para poder insertarlo
en el orden adecuado. Recordá que, como se explica en el capítulo de colecciones del libro Pharo By Example, una SortedCollection
es una colección que ordena automáticamente los elementos según cierto criterio al momento en que
son agregados a la colección. Si no le definís vos ese criterio, entonces realizará las comparaciones por defecto. En tu segundo ejemplo sí te funciona porque los elementos son instancias de la clase SmallInteger
, que sí tiene implementado
los mensajes >=
e ifTrue:ifFalse:
. En cambio, las instancias de tu clase Película
no entienden esos mensajes.
La solución es que no uses una SortedCollection
dado que no tiene sentido que los elementos cambien de lugar. Sería más práctico usar una simple OrderedCollection
o alguna otra colección que te convenga más.
Por otro lado, no es necesario que realices la validación de la vacuidad de la colección cada vez que intentes agregar un elemento. Para eso justamente existe el método initialize, para que puedas instanciar los atributos necesarios estableciendo así el estado inicial del objeto.
Saludos,
Tomás
Lo habia intentado con initialize la primera vez y no funcionaba. Por eso le puse el if.
Empezó a funcionar cuando lo cambie por un OrderedCollection (no sorted). Era eso. Gracias!
Y si quisiese pasarle el criterio de orden? Como se lo paso?
Gracias!
Y si quisiese pasarle el criterio de orden? Como se lo paso?
Pues sería tal cual como el ejemplo de la página 205 del libro, instanciando a la SortedCollection
con el mensaje sortBlock: unBloque
en lugar de con new
. Por ejemplo:
| peliculas pelicula1 pelicula2 pelicula3 | pelicula1 := Pelicula new. pelicula1 establecerNombre: 'Jackie Brown'. pelicula1 establecerAnio: 1997. pelicula2 := Pelicula new. pelicula2 establecerNombre: 'Kill Bill'. pelicula2 establecerAnio: 2003. pelicula3 := Pelicula new. pelicula3 establecerNombre: 'Reservoir Dogs'. pelicula3 establecerAnio: 1992. peliculas := SortedCollection sortBlock: [ :p1 :p2 | p1 obtenerAnio <= p2 obtenerAnio ]. peliculas add: pelicula1; add: pelicula2; add: pelicula3. Transcript clear. peliculas do: [ :pelicula | Transcript show: pelicula nombre; cr. ].
Este tipo de cosas las veremos dentro de un par de clases y están fuera del alcance del TP0. Si te da curiosidad podés probar este otro ejemplo.
Saludos,
Tomás