トラック
/
Crystal
Crystal
/
演習
/
アリーの素晴らしいラザニア
アリーの素晴らしいラザニア

アリーの素晴らしいラザニア

学習演習

はじめに

はじめに

変数

変数を宣言するには、=代入演算子を使います。 Crystalでは、変数にはsnake_case形式を使います。

number = 1
puts number # => 1

number = 2
puts number # => 2

定数

定数も同じ=代入演算子で宣言しますが、SCREAMING_SNAKE_CASEと呼ばれるすべて大文字を使います。

NUMBER = 1
puts NUMBER # => 1

すでに定義済みの定数に値を代入すると、コンパイルエラーになります。

NUMBER = 1

NUMBER = 2
# Error: already initialized constant NUMBER

型

Crystalはコンパイル言語です。つまり、すべての変数やメソッドの引数には、コンパイル時に型が割り当てられます。 コンパイラーは、変数やメソッドの引数の型を推論できます。 ただし、場合によっては型を指定する必要があります。 型の指定が必要になるケースは、後の概念で説明します。

メソッド

メソッドは、再利用できる一連の命令をまとめる仕組みです。 Crystalでは、メソッドはクラス、モジュール、構造体の中で定義することが多いです。 ただし、クラス、モジュール、構造体の外で定義することもできます。 メソッドはdefキーワードを使って宣言し、その後にメソッド名を続けます。 Crystalでは、メソッド名にはsnake_caseを使います。 メソッドに引数がない場合は、括弧(())を省略できます。 メソッドの終わりを宣言するには、endキーワードを使います。

def hello
  puts "Hello World!"
end

変数やメソッドの引数の型に存在しないメソッドを使うと、コンパイルエラーになります。

number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String

引数

メソッドには引数を持たせることができます。 引数は、メソッドに渡されるデータです。 メソッドに引数を渡せるようにするには、引数の名前を指定する必要があります。 Crystalでは、引数にもsnake_caseを使います。 メソッドには複数の引数を持たせることができますが、引数はコンマで区切る必要があります。

def hello(name)
  puts "Hello #{name}!"
end

メソッドには複数の引数を持たせることもできます。 この場合、引数はコンマで区切ります。

def hello(name, language)
  puts "Hello #{name}! You are learning #{language}."
end

メソッドの呼び出し

クラス、モジュール、構造体に属するメソッドを呼び出すときは、ドット演算子(.)を使います。 形式は<ClassName>.<method_name>とします。 メソッドがクラス、モジュール、構造体に属していない場合は、名前を書くだけで呼び出せます。 メソッドは常に、最後の式の値を暗黙的に返します。

メソッドに引数がある場合は、メソッドの呼び出しと定義のどちらでも、次のように括弧を使って引数を指定できます: <method_name>(<argument_1>, <argument_2>, ...)。 メソッドに引数がない場合は、括弧を省略します。

def hello(name)
  "Hello #{name}!"
end

hello("Crystal")
# => Hello Crystal!

複数の引数を持つメソッドを呼び出すときは、引数をコンマで区切ります。 引数は、メソッドの引数と同じ順番で指定する必要があります。

def hello_language(name, language)
  "Hello #{name}! You are learning #{language}."
end

hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.

引数の数が合わないメソッドを呼び出すと、コンパイルエラーになります。

hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)

足し算・引き算・掛け算

Crystalでは、+演算子で2つの数値を足せます。 -演算子で2つの数値を引くこともできます。 そして*演算子で2つの数値を掛けることもできます。

1 + 1
# => 2

2 - 1
# => 1

2 * 2
# => 4

コメント

Crystalでは、コメントは#文字で書き、その後にスペース、そしてコメントを続けます。 コメントはコードを説明するために使います。 コンパイラーはコメントを実行しません。

# This is a comment

説明

この演習では、お気に入りの料理本に載っている最高のラザニアを作るためのコードを書きます。

タスクは4つあり、どれもラザニアの調理にかかる時間に関するものです。

1. オーブンに入れておくべき時間を分単位で定義する

LasagnaクラスにEXPECTED_MINUTES_IN_OVEN定数を定義します。この定数には、ラザニアをオーブンに入れておくべき時間(分)を格納します。 料理本によると、オーブンに入れておくべき時間は40分です。

Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40

2. オーブンでの残り時間を分単位で計算する

Lasagna#remaining_minutes_in_ovenメソッドを定義します。このメソッドは、ラザニアを実際にオーブンに入れておいた時間(分)を引数として受け取り、前のタスクで定義したオーブンでの想定時間をもとに、ラザニアをあと何分オーブンに入れておく必要があるかを返します。

Lasagna.new.remaining_minutes_in_oven(30)
# => 10

3. 準備時間を分単位で計算する

Lasagna#preparation_time_in_minutesメソッドを定義します。このメソッドは、ラザニアに重ねた層の数を引数として受け取り、準備にかかった時間(分)を返します。層を1つ重ねるのに2分かかるものとします。

Lasagna.new.preparation_time_in_minutes(2)
# => 4

4. 合計の作業時間を分単位で計算する

Lasagna#total_time_in_minutesメソッドを定義します。このメソッドは、名前付きの引数を2つ受け取ります。number_of_layers引数はラザニアに重ねた層の数、actual_minutes_in_oven引数はラザニアをオーブンに入れておいた時間(分)です。 このメソッドは、ラザニアの調理にかかった合計時間(分)を返します。合計時間は、準備にかかった時間(分)と、その時点でラザニアをオーブンに入れておいた時間を足したものです。

number_of_layers = 3
actual_minutes_in_oven = 20
Lasagna.new.total_time_in_minutes(number_of_layers, actual_minutes_in_oven)
# => 26
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Crystal Exercism

アリーの素晴らしいラザニアを始める準備はできましたか?

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