トラック
/
Crystal
Crystal
/
演習
/
パーティーロボット
パーティーロボット

パーティーロボット

学習演習

はじめに

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から文字を取得するには、おなじみの角括弧([])を使います。

Note

[]は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"

説明

むかしむかし、鉄格子のついた窓のある不思議な家に住む、風変わりなプログラマーがいました。ある日、彼はオンラインの求人サイトで、パーティーロボットを作る仕事を引き受けました。そのロボットは、人々にあいさつして、席へ案内するはずのものでした。最初のバージョンはとても機械的で、プログラマーが人づきあいを苦手としていることがにじみ出ていました。その一部は、次のバージョンにもそのまま残ってしまいました。

1. パーティーに来た新しいゲストを歓迎する

welcomeメソッドを実装して、与えられた名前を使った歓迎のメッセージを返すようにしましょう。

PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!

2. 今日が誕生日の新しいゲストを歓迎する

happy_birthdayメソッドを実装して、与えられた名前と年齢を使った誕生日のメッセージを返すようにしましょう。残念ながら、このプログラマーは少し見せびらかしたがりなので、ロボットはゲスト全員の誕生日を知っているところを見せなければなりません。

PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!

3. 道案内をする

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.
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Crystal Exercism

パーティーロボットを始める準備はできましたか?

Exercismに登録すれば、26個のコンセプト142個の演習、そして本物の人間によるメンタリングとともに、Crystalを学んでマスターできます。すべて無料です。