Char is a data type in Crystal representing a 32-bit Unicode code point.
Their size makes them memory efficient and gives them specific properties that Strings doesn't have.
They are created using single quotes (') and only allow one Unicode code point to be placed inside.
'a' # => 'a'
'a'.class # => Char
It is quite common to work with Chars when working with Strings in Crystal since quite a few methods in the String class return Chars or take Chars as arguments.
For example, the String#[] method returns a Char, or the String#chars method returns a collection of Chars.
Due to char being a 32 Unicode point do they support incrementing and decrementing, this makes it so if you have 'a' so can you get 'b' by adding one.
'a' + 5
# => 'f'
'z' - 25
# => 'a'
There is also a method called Char#succ, which returns the next char in the Unicode table, and Char#pred, which returns the previous char in the Unicode table.
'a'.succ
# => 'b'
'z'.pred
# => 'y'
Since Chars is only meant to represent a 32-bit Unicode, two chars can't be concatenated. Therefore, Chars can only be concatenated with Strings.
'a' + "bc"
# => "abc"
'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char
Crystal has a few methods for getting information about a Character, such as whether it is a number or a letter or whether it is uppercase or lowercase. Here is a list of some of the methods, for a complete list see the Char API:
| Method | Description |
|---|---|
Char#number? |
Returns true if the Char is a number |
Char#letter? |
Returns true if the Char is a letter |
Char#lowercase? |
Returns true if the Char is lowercase |
Char#uppercase? |
Returns true if the Char is uppercase |
Char#ascii? |
Returns true if the Char is an ASCII character |
Char#whitespace? |
Returns true if the Char is a whitespace character |
Since Chars is a 32-bit Unicode point, can you convert between Chars and code points (Int).
This can be done using the Char#ord method which will return the code point of the Char, or the Int#chr method which will return the Char of the code point.
'a'.ord
# => 97
97.chr
# => 'a'
As with other data types, chars have a few methods for converting between types.
The most common one is the Char#to_s method, which converts the Char to a String. However, there is also the Char#to_i method, which converts the Char to an Int, and the Char#to_f method, which converts the Char to a Float.
'a'.to_s
# => "a"
'4'.to_i
# => 4
'a'.to_i
# => Error: Invalid integer: a (ArgumentError)
As with Strings, there are certain characters that can't be written directly, and to write them, you need to escape them.
You can use the \ character to write an escape sequence followed by the character you want to escape.
These are the special characters in Crystal:
| Value | Description |
|---|---|
\a |
Alert |
\b |
Backspace |
\e |
Escape |
\f |
Form feed |
\n |
Line feed or newline |
\r |
Carriage return |
\t |
Horizontal tab |
\v |
Vertical tab |
\\ |
Backslash |
\' |
Single quote |
\" |
Double quote |
\377 |
Octal ASCII character |
\xFF |
Hexadecimal ASCII character |
\uFFFF |
Hexadecimal unicode character |