Mark Greenaway mark@knobbits.org writes:
I'm fairly new to Smalltalk and have been learning mostly by looking at web pages and bits of Squeak code. I was wondering if there was a way to initialise dictionaries in the same way you can in Python i.e.
dict = {1 : 2, 3 : 4}
I was hoping something like {1->2. 3->4} asDictionary might work, but asDictionary converts the keys to strings using printString. Should I just change asDictionary or is there a better way?
Well, Dictionary Class >> newFrom: aDictOrArray contains a couple of examples of ways to do, this, namely
Dictionary newFrom: {1->#a. 2->#b. 3->#c} {1->#a. 2->#b. 3->#c} as: Dictionary
But the comments and argument name in that method were such that you were unlikely to find it. I've changed the comments, and attach the fixed version.
Normally, I expect that
{1->#a. 2->#b. 3->#c} as: Dictionary and {1->#a. 2->#b. 3->#c} asDictionary
would do the same thing, in fact, it is usual for the asFoo method to be implemented using self as: Foo, which in turn is implemented using Foo newFrom: self. However, as Mark correctly points out, asDictionary is weird. Moreover, there are no send of this message in my image.
SequenceableCollection >> asDictionary "Answer a Dictionary whose keys are string versions of my indices and whose values are my elements. 6/12/96 sw"
| aDictionary | aDictionary _ Dictionary new. 1 to: self size do: [:i | aDictionary add: (Association key: i printString value: (self at: i))]. ^ aDictionary
I wonder if anyone (sw?) can shed light on where this method came from, and why it is part of the image? I think that Mark had the right idea when he suggested changing it, or at least renaming it to something like asDictionaryKeyedByStrings.