2016-10-17 1 views
1

Je suis relativement nouveau pour Smalltalk et je suis bloqué sur la façon d'imprimer des éléments depuis une pile. J'ai deux classes, une qui crée la pile using OrderedCollection, qui fonctionne, et une deuxième classe (sous-classe d'objet). Pour la deuxième classe, j'ai deux variables d'instance name et weight (avec set et get methods). Je dois faire deux autres méthodes print et printSpecial. L'impression donne le nom et le poids à la transcription sur la même ligne en utilisant la méthode get du nom, mais ne peut pas utiliser la méthode get de weight. PrintSpecial est similaire à l'impression, mais le poids doit être < 100. J'ai essayé de faire print et printScpecial mais je n'arrive pas à le comprendre. Voici ce que j'ai jusqu'ici. Toute aide serait appréciée.Impression à partir d'un OrderedCollection dans Smalltalk

name: a 
    name := a 

name 
    ^name 

print 
    [ Transcript 
     show: weight; 
     show: name; 
     cr ] 

printSpecial 
    [ weight <= 100 ] 
     whileTrue: [ Transcript 
      show: weight; 
      show: name; 
      cr ] 

Répondre

4

Les deux vos méthodes print et printSpecial enferment leur corps entre crochets. Vous devriez les enlever. Essayez:

print 
    Transcript 
    show: weight; 
    show: name; 
    cr 

printSpecial 
    weight <= 100 ifTrue: [ 
    Transcript 
     show: weight; 
     show: name; 
     cr] 

Notez que dans printSpecial je l'ai remplacé whileTrue: avec ifTrue:. La raison en est que vous ne voulez pas continuer à imprimer pour toujours si le weight arrive à rencontrer la condition.

Une autre chose que je suggère est d'éviter de répéter le code. Donc, je propose ceci:

printSpecial 
    weight <= 100 ifTrue: [self print] 

De cette façon, si vous décidez d'améliorer print vous n'aurez pas à copier l'amélioration de printSpecial.

Enfin, vous dites que vous avez une collection de ces objets. Par conséquent, vous devriez avoir un moyen de les énumérer (par exemple, via do:). Ainsi, si la requête réelle consistait à les imprimer tous, vous devez implémenter print et printSpecial dans la classe des éléments, puis implémenter les mêmes messages dans votre classe Stack.

Stack >> print 
    collection do: [:elem | elem print] 

Stack >> printSpecial 
    collection do: [:elem | elem printSpecial] 

où je suppose que la variable d'instance qui détient vos éléments est nommé collection.

Encore mieux. Vous pouvez implémenter do: dans votre classe Stack, puis utiliser self do: au lieu de collection do: comme je l'ai fait ci-dessus. Quelque chose sur les lignes de

Stack >> do: aBlock 
    collection do: aBlock 

puis

Stack >> print 
    self do: [:elem | elem print] 

Stack >> printSpecial 
    self do: [:elem | elem printSpecial] 
+0

Merci, cela m'a beaucoup aidé. – user2871898