I think you probably need to show us *all* the code.directionLooking: aString
self new direction: aStringWell, there is your problem.There are two ways for a method to return a value.One is to execute '^ e' for some expression e,which is quite like a 'return e;' statement in C.The other is to execute the whole body and come tothe end of the method, and in that case the resultis always 'self'. This means that the method as youwrote it- created an uninitialised or incompletely initialisedinstance of Robot (self new)- asked that instance to set its direction- discarded the result of that setting- forgot the new instance- returned the Robot classWhat you probably meant wasdirectionLooking: aString
^(self new) direction: aString; yourselfwhere 'yourself' has nothing to do with a newobject being created but with the fact thatyou want the new object as the result, notwhatever #direction: returns.directionLooking: aString|newRobot|newRobot := self new.newRobot direction: aString.^newRobotmay be clearer to you.By the way, you didn't say WHY the caller wants a Dictionaryinstead of a Robot. I don't think I've ever written a programwhere that was a good idea.On Sun, 31 Mar 2019 at 19:55, Roelof Wobben <r.wobben@home.nl> wrote:Op 31-3-2019 om 03:47 schreef Richard O'Keefe:
Question 1. Should that be #asDictionary?
yes, it does.
Question 2. If not, what's a Dictonary?Question 3. I see you are using self-encapsulation,with a getter 'self robot'and a setter 'self robot: something'.Of course that means that outside codecan freely smash your "robot" property,unless #robot: checks that its argumentmakes sense. Does it?
no, it does not.
Question 4. What kind of thing *is* "robot".Have you checked that 'Robot directionLooking: ...'returns an instance of Robot? If you accidentallyomitted '^' it might return the Robot class itself.
yes, I forget the ^ thing
see this code.
directionLooking: aString
self new direction: aString
so I have to think well how to return a instance of a Robot here.
as far as I see I do not have a robot yet.
createDirection: aString position: aCollection
self robot: (Robot directionLooking: aString) yourself.
^ self robot asDictionary
or I overlook something.
Question 5. Are you sure that 'self robot' returnswhat you think it does? Have you checked?
yes, I checked. self Robot give me a variable robot which is a Robot.
Question 6. Does Robot have an #asDictionary method?Does Robot have an #asDictonary method?
Yes, it does
Question 7. Why is "aCollection" not used in this method?
Because I wanted to be sure things are working before I added the position which is a difficult one.
Question 8. Why are you using 'yourself'?
I thought I was needed so I get a instance of a Robot back.
Question 9. Why does the caller want a dictionary instead ofa Robot? What should be in that dictionary?
The same data as the Robot has but then in a dictionary form.
That is what I try to achieve.
There are more questions but those will do to be going on with.If your #robot: method began likerobot: aRobot(aRobot isKindOf: Robot)ifFalse: [aRobot error: 'not an instance of Robot'].you would have caught what I suspect is your problem.Check question 4.
On Sun, 31 Mar 2019 at 07:19, Roelof Wobben <r.wobben@home.nl> wrote:
Hello,
Im busy with a new challenge from exercism.
Where I have to keep track of a robot , where it facing and on that
coordinate the robot is.
so I made this function what the test wanted
createDirection: aString position: aCollection
self robot: (Robot directionLooking: aString) yourself.
^ self robot asDictonary
I can see that on the first part a new robot is made with the right data.
but the test wants the data back as a Dictonary
that is why I made the self robot asDictonary line
but to my suprise the compiler wants it be a class method where I expect
it to be a instance method.
Can someone explain to my why this is ?
Roelof