Crystalには、テキストを表すために使われるStringという型があります。
Crystalの文字列は、Unicode文字の並びです。
文字列はイミュータブルで、一度作成すると変更できません。
つまり、文字列を変更するたびに新しい文字列が作成され、元の文字列は変更されません。
文字列を定義するには、二重引用符"を使います。
"Hello World"
2つの文字列を連結するには、+演算子を使います。
+演算子は、2つの文字列を組み合わせた新しい文字列を返します。
hello = "Hello"
hello + " World"
# => "Hello World"
to_iメソッドは、文字列を整数に変換します。
あるいは、to_fメソッドを使うと、小数を返すこともできます。
文字列を数値に変換できない場合は、ArgumentErrorが発生します。
"1".to_i
# => 1
"1.0".to_f
# => 1.0
"Hello".to_i
# => ArgumentError: Invalid integer: Hello
整数や小数は、to_sメソッドを使って文字列に変換できます。
1.to_s
# => "1"
1.0.to_s
# => "1.0"
文字列補間を使うと、文字列を組み合わせたり、式を文字列に埋め込んだりできます。
文字列を補間するには、#に続けて波括弧({})を書き、その中に式を入れます。
name = "World"
"Hello #{name}!"
# => "Hello World!"
Crystalは、式の結果を自動的に文字列に変換します。
"Hello #{1 + 1}!"
# => "Hello 2!"
文字列の文字数を知りたいときは、sizeメソッドを使います。このメソッドは、文字列の長さを整数で返します。
文字列のサイズは文字列に保存されたプロパティなので、メソッドを呼び出すたびに計算する必要がなく、非常に高速です。
"Hello World".size
# => 11
インデックス指定とは、文字列から特定の文字を取り出すことです。
Stringから文字を取得するには、おなじみの角括弧([])を使います。
[]はStringのインスタンスメソッドとして実装されており、インデックスがメソッドの引数になります。
文字列の最初の文字は、インデックス0にあります。
"Hello World"[0]
# => 'H'
"Hello World"[6]
# => 'W'
文字列の末尾から文字を取得するには、文字列の長さから1を引くと最後の文字のインデックスになり、最後から2番目の文字なら長さから2を引く、というようにします。 これにはショートカットがあり、負のインデックスを使うだけです。最後の文字はインデックス-1、最後から2番目の文字はインデックス-2、というようになります。
name = "Hello World"
name[name.size - 1]
# => 'd'
name[-1]
# => 'd'
文字列に直接書けない文字もあります。その場合はエスケープシーケンスを使います。
たとえば、文字列の中で二重引用符を使いたいときは、二重引用符をエスケープする必要があります。
\に続けてエスケープしたい文字を書くと、エスケープシーケンスになります。
Crystalの特殊文字は次のとおりです。
| Value | Description |
|---|---|
\a |
警告 |
\b |
バックスペース |
\e |
エスケープ |
\f |
改ページ |
\n |
ラインフィード(改行) |
\r |
キャリッジリターン |
\t |
水平タブ |
\v |
垂直タブ |
\\ |
バックスラッシュ |
\' |
一重引用符 |
\" |
二重引用符 |
\377 |
8進数のASCII文字 |
\xFF |
16進数のASCII文字 |
\uFFFF |
16進数のUnicode文字 |
puts "Hello \"World\""
# => Hello "World"
puts "Hello \nWorld"
# => Hello
# => World
複数行の文字列を書くには、1行の文字列と同じ構文を使い、文字列に含めたい行ごとに改行します。
"Hello
World"
# => "Hello\nWorld"
むかしむかし、鉄格子のついた窓のある不思議な家に住む、風変わりなプログラマーがいました。ある日、彼はオンラインの求人サイトで、パーティーロボットを作る仕事を引き受けました。そのロボットは、人々にあいさつして、席へ案内するはずのものでした。最初のバージョンはとても機械的で、プログラマーが人づきあいを苦手としていることがにじみ出ていました。その一部は、次のバージョンにもそのまま残ってしまいました。
welcomeメソッドを実装して、与えられた名前を使った歓迎のメッセージを返すようにしましょう。
PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!
happy_birthdayメソッドを実装して、与えられた名前と年齢を使った誕生日のメッセージを返すようにしましょう。残念ながら、このプログラマーは少し見せびらかしたがりなので、ロボットはゲスト全員の誕生日を知っているところを見せなければなりません。
PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!
assign_table関数を実装して、道案内をするようにしましょう。この関数は5つの入力を受け取ります。
String)Int)String)String)Float64)正確な結果のフォーマットは、以下の例で確認できます。
隣に座る人の名前は、その名前の最初と最後の文字に短縮します。FrankはFk、ChristianはCn、というようになります。
ロボットはテーブル番号を伝えます。また、テーブルまでの距離にも触れます。ありがたいことに、その精度は小数点以下1桁までに限られています。
PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.