Charは、Crystalで32ビットのUnicodeコードポイントを表すデータ型です。そのサイズのおかげでメモリ効率がよく、Stringにはない特有の性質も持っています。Charはシングルクォート(')を使って作成し、中には1つのUnicodeコードポイントしか入れられません。
'a' # => 'a'
'a'.class # => Char
CrystalでStringを扱うとき、Charを扱う機会はよくあります。Stringクラスの多くのメソッドがCharを返したり、Charを引数に取ったりするからです。たとえば、String#[]メソッドはCharを返し、String#charsメソッドはCharのコレクションを返します。
Charは32ビットのUnicodeコードポイントなので、インクリメントとデクリメントができます。そのため、'a'に1を足せば'b'が得られます。
'a' + 5
# => 'f'
'z' - 25
# => 'a'
また、Unicodeテーブルの次のCharを返すChar#succというメソッドと、前のCharを返すChar#predもあります。
'a'.succ
# => 'b'
'z'.pred
# => 'y'
Charは32ビットのUnicodeコードポイントを表すためだけのものなので、2つのCharを連結することはできません。そのため、CharはStringとしか連結できません。
'a' + "bc"
# => "abc"
'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char
Crystalには、その文字が数字なのか文字なのか、大文字なのか小文字なのかといった、文字についての情報を得るためのメソッドがいくつかあります。以下はメソッドの一部です。完全なリストはChar APIを参照してください。
| メソッド | 説明 |
|---|---|
Char#number? |
Charが数字であればtrueを返します |
Char#letter? |
Charが文字であればtrueを返します |
Char#lowercase? |
Charが小文字であればtrueを返します |
Char#uppercase? |
Charが大文字であればtrueを返します |
Char#ascii? |
CharがASCII文字であればtrueを返します |
Char#whitespace? |
Charが空白文字であればtrueを返します |
Charの相互変換Charは32ビットのUnicodeコードポイントなので、Charとコードポイント(Int)の間で変換できます。これには、Charのコードポイントを返すChar#ordメソッドや、コードポイントのCharを返すInt#chrメソッドを使います。
'a'.ord
# => 97
97.chr
# => 'a'
他のデータ型と同様に、Charには型を変換するためのメソッドがいくつかあります。最もよく使われるのは、CharをStringに変換するChar#to_sメソッドです。ほかにも、CharをIntに変換するChar#to_iメソッドや、CharをFloatに変換するChar#to_fメソッドがあります。
'a'.to_s
# => "a"
'4'.to_i
# => 4
'a'.to_i
# => Error: Invalid integer: a (ArgumentError)
ルトンの図書館は、本から芸術作品まで幅広い蔵書を誇る大きな図書館です。この図書館には、文学を研究し、本をコンピューターシステムに登録する部門があります。
いくつかの業務は自動化を目指しており、そのお手伝いを頼まれています。登録手続きのフォームの自動化から、テキストの復号の補助まで、幅広い作業が含まれます。
図書館の本はすぐに見つけられるように、タイトルの最初の文字で並べ替えられています。
Library.first_letterメソッドを実装してください。このメソッドは、本のタイトルが入った引数titleを受け取ります。
メソッドはタイトルの最初の文字を返すようにしてください。
Library.first_letter("Mystery of the Crystal Skull")
# => 'M'
図書館には、さまざまな著者が書いた本がたくさんあります。
著者はイニシャルで呼ばれることが多いため、図書館は著者の名前と苗字を入力するとその著者のイニシャルを返すシステムを求めました。
イニシャルは{first_letter_of_first_name}.{first_letter_of_last_name}のように整形します。
Library.initialsメソッドを実装してください。このメソッドは、著者の名前と苗字が入ったfirst_nameとlast_nameの2つの引数を受け取ります。
メソッドは著者のイニシャルを返すようにしてください。
Library.initials("William", "Shakespeare")
# => "W.S"
文学作品の中には暗号化されたものもあり、図書館には暗号化されたテキストがたくさんあります。 図書館は、特殊な暗号方式のための新しい復号システムを望んでいます。
この暗号方式は、文字をアルファベット順で1つ前の文字に置き換えることで成り立っています。
たとえばaはzに、bはaに、cはbに、といった具合です。
図書館は、大文字と小文字の両方を復号でき、元の文字と同じ大文字・小文字を保つことを望んでいます。
Library.decrypt_characterメソッドを実装してください。このメソッドは、復号する文字が入った引数characterを受け取ります。
メソッドは復号した文字を返すようにしてください。
Library.decrypt_character('a')
# => 'z'
図書館は、アルファベット順で1つ前の文字に置き換えるこの暗号方式で、テキスト全体を復号できるようにもしたいと考えています。
復号プログラムは文字だけを復号し、それ以外の文字はそのままにしておく必要があります。
Library.decrypt_textメソッドを実装してください。このメソッドは、復号するテキストが入った引数textを受け取ります。
メソッドは復号したテキストを返すようにしてください。
Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"