Notably, this category contains classes Character
, String
and Symbol
. String
instances are collections of Character
instances. All these are limited to the small ASCII character set. The corresponding classes that can handle the much larger Unicode character set are UnicodeCodePoint
, UnicodeString
, and UnicodeSymbol
. As stated before, the Unicode classes can also handle ASCII, and they are interchangeable. You usually don’t need to care about which flavor (ASCII or Unicode) an instance actually is.
Character/UnicodeCodePoint. An individual character is written prefixed with a “$”, for example: $A
or $φ
. It can be defined with the class side method codePoint:
. Note, however, that you can ask Character only about valid Characters. It is generally safer to ask UnicodeCodePoint instead:
Character codePoint: 65 ⇒ $A Character codePoint: 966 ⇒ nil UnicodeCodePoint codePoint: 966 ⇒ $φ
There are class-side methods for nonprintable characters:
Character tab
, Character lf
, etc.
Additionally, UnicodeCodePoint
defines a #namedCharactersMap
, that lets you enter many Unicode characters easily, like:
\leftright
then press spacebar.
As each string is a collection of characters, when iterating a string we
can use the Character
instance methods:
'There are 12 apples.' select: [:c |c isDigit]. ⇒ '12'
Modify Example 3.13 to reject the numeric characters.
String. String
is a very large class, it comes with
more than 200 methods. It is useful to browse these method categories
to see common ways to group methods.
Sometimes you may not see a category related to what you’re looking for right away.
If you expect a method selector to start with a specific letter, click-select the
-- all --
method category, then move the cursor over the pane listing the method names. Press this character, e.g.$f
. This will scroll the method pane to the first method name starting with an “f”.
Consider the case where you need to search for a substring, a string within a
string: when browsing
the String
class, search for method categories named like
finding... or accessing. There you find a family of
findXXX
methods. Read the comments at the beginning of these
methods:
findString: subString "Answer the index of subString within the receiver, starting at start. If the receiver does not contain subString, answer 0." ^ self findString: subString startingAt: 1.
Or:
findString: key startingAt: start caseSensitive: caseSensitive "Answer the index in this String at which the substring key first occurs, at or beyond start. The match can be case-sensitive or not. If no match is found, zero will be returned." ../..
Then experiment with the potentially interesting messages in a workspace:
'I love apples' findString: 'love' ⇒ 3 "match starts at position 3" 'I love apples' findString: 'hate' ⇒ 0 "not found" 'We humans, we all love apples' findString: 'we' ⇒ 12 'We humans, we all love apples' findString: 'we' startingAt: 1 caseSensitive: false ⇒ 1 'we humans, we all love apples' findString: 'we' ⇒ 1 'we humans, we all love apples' findString: 'we' startingAt: 2 ⇒ 12
Following these paths will, most of the time, lead you toward the answer you are looking for.
We want to format a string of the form ’Joe bought XX apples and YY oranges’ to the form ’Joe bought 5 apples and 4 oranges’. What message should be used?