[Seaside] question on tutorial - contact manager
John M McIntosh
johnmci at smalltalkconsulting.com
Sat Feb 20 19:11:45 UTC 2010
On 2010-02-20, at 9:20 AM, Randal L. Schwartz wrote:
> a := 'foo'.
> b := 'foo'.
> a = b "true, but done by comparing character by character"
> a == b "false, because they are actually different String objects"
> c := #foo.
> d := #foo.
> c = d "true, but mapped into..."
> c == d "also true, they are the same object"
> Symbols are often used in code like the above to ensure
> that the comparisons are very quick.
Let me make a few notes about what Randal said:
(a) the example above
a := 'foo'.
b := 'foo'.
a == b
will evaluate to TRUE in a Squeak workspace because the smalltalk parser/compiler sees the fact that
'foo' being a constant can be reused as an optimization and both 'a' and 'b' point to it.
(b) using '==' can be dangerous if you don't understand the implications. For example.
20 factorial == 20 factorial -> false
yet in a workspace
2432902008176640000 == 2432902008176640000 -> true
and to confuse you more then
10 factorial == 10 factorial -> true
(b) is a special case where the resulting integer from '10 factorial' is a SmallInteger, an immediate object, so == considers if
the value of the immediate object is the same, where as the '20 factorial' is a LargePositiveInteger and we are comparing the
Oops pointer for '==' not the value. And of course the 2432902008176640000 in a work space is a constant so (a) applies.
(c) use of a Symbol is more more memory friendly.
foobar gender = #Female
If the foobar object contains 'Female' this could mean if you have 100,000 foobar objects you could have 100,000 strings 'Female'
if the foobar object contains #Female then all 100,000 foobar objects point to just one symbol.
John M. McIntosh <johnmci at smalltalkconsulting.com> Twitter: squeaker68882
Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com
More information about the seaside