4.1 String – a particular collection

The String class also inherits behavior from its ancestor classes. Indeed String is a subclass of CharacterSequence, itself a subclass of SequenceCollection . The direct consequence is that when searching for some specific behavior, you may need to explore the parent classes too. The whole behavior of a class, defined in the class itself and its parents is called its protocol.

Again the browser is helpful to explore a class protocol. You have two options:

  1. Explore the protocol. In the class pane of the browser, do ...select String class → right mouse button → Browse protocol (p)... Alternatively, use the keyboard shortcut Ctrl-p.
    ch03-browseProtocol

    Figure 4.1: Browse String protocol

    The new window is a protocol browser for the String class. At the left, we see a hierarchy of the String’s ancestor classes. At the right are the method selectors for strings and, in parenthesis, the class where they are defined. Methods defined in class String itself are in bold characters.

    Selecting one class there only shows the protocol starting from this class down to the String class. If you select String in the left panel, you only see methods defined in the String class itself.

    In Figure 4.1, no specific class is selected, therefore the whole String protocol is listed at the right. The method before: implemented in SequenceableCollection is selected and its source code is displayed on the large bottom pane.

  2. Explore the hierarchy. In the class pane of the browser, do ...select String class → right mouse button → Browse hierarchy (h)... Alternatively, use the keyboard shortcut Ctrl-h or the button hierarchy on the system browser.
    ch03-browseHierarchy

    Figure 4.2: Browse the String hierarchy

    The hierarchy browser is very like the system browser with only two differences:

    • At the far left, the class categories pane is absent,
    • In the classes pane, the hierarchy of String is printed. It makes easy to browse String parent and child classes.

The hierarchy browser is a general tool for exploration. Unlike the protocol browser, it does not display the entire protocol of a class. No inherited methods are shown, only those defined directly in the selected class. In Figure 4.2, the class SequenceableCollection is selected as well as its method before:.

The before: method extracts from a collection the element before a specified element. When inherited in String, those elements are Character instances:

'1 + 3i' before: $i
⇒ $3

Practice the tools and resolve the exercise below.

 CuisLogo Find the appropriate method to transform ’Hello My Friend’ into ’My Friend’.

Exercise 4.1: Cut a string

Beware, some messages in the String protocol may obviously not work. Observe below, the error is thrown on a Character instance:

'Hello My Friend' cos
⇒ MesageNotUnderstood: Character>>cos

If you look at implementors of cos, you can find that Collection expects to apply cos to each member of a collection, hence a character is asked for its cosine.

Symbol. A symbol is very like a string but it is unique and never duplicated. Two references to 'hello' might be to two or only one object depending computational history. Two references to #hello are guarenteed to always refer to the same object.

Symbols got their name because they are used as symbolic constants. You already observed how in the book we wrote message selectors as a symbol. We use symbols because each message name must uniquely index the code for a method. You will use a symbol when you need to name something uniquely.

In the example below, observe the same behavior with string:

'hello' == 'hello' copy
⇒ false
#hello  == #hello copy
⇒ true

Now you know. A symbol can’t be duplicated nor changed.

 note In Cuis-Smalltalk, strings with characters not part of the ASCII table are usually instances of UnicodeString. In the same way, you may get an instance of UnicodeSymbol and not Symbol, or UnicodeCodePoint and not Character. You usually don’t need to care about this. The ASCII and Unicode classes provide the same services.

Symbols can contain space characters:

'hello my friend' asSymbol
⇒ #'hello my friend'

Symbol is a subclass of String and much of its behavior is inherited. As we learn about Strings we are also learning quite a bit about symbols.

Note that many String methods are defined to return strings.

'hello my friend' class.
⇒ String
#'hello my friend' class.
⇒ Symbol 
#'hello my friend' asCamelCase
⇒ 'helloMyFriend'
#'hello my friend' asCamelCase asSymbol 
⇒ #helloMyFriend