この演習では、Rubyの基本的な構成要素を学びます。 扱う範囲は広いですが、難しく感じても心配しないでください。トラックを進めていく中で、それぞれの内容をずっと詳しく掘り下げていきます。
Rubyを理解するうえで重要なポイントの一つは、Rubyがオブジェクト指向言語であるということ、そしてRubyではすべてがオブジェクトであるということです。数値も文字列も配列も、すべてオブジェクトです。
オブジェクトは、変数か定数を使って名前を付けて利用するのが一般的です。
変数は常にスネークケースで書きます。
変数は、その寿命の中でさまざまなオブジェクトを参照できます。
たとえば、my_first_variableは=演算子を使って何度も定義し直すことができます。
my_first_variable = 1
my_first_variable = "Some string"
my_first_variable = SomeComplexObject.new
一方、定数は一度だけ代入するものです。 大文字で始める必要があり、通常はすべて大文字で、単語をアンダースコアで区切って書きます。 たとえば、次のとおりです。
MY_FIRST_CONSTANT = 10
# Redefining not allowed
# MY_FIRST_CONSTANT = "Some String"
Rubyはクラスによって整理されています。
クラスは、classキーワードの後にクラス名を書いて定義します。
オブジェクトは通常、.newメソッドでクラスをインスタンス化して作ります。
たとえば、次のとおりです。
# Define the class
class Calculator
#...
end
# Create an instance of it and assign it to a variable
my_first_calc = Calculator.new
機能の単位はメソッドにまとめられます。これは他の言語の_関数_に似ています。
メソッドは、位置引数やキーワード引数(:構文を使って定義・呼び出しします)を使って定義することも、引数をまったく持たないようにすることもできます。
メソッドは、最後に評価された文の結果を暗黙的に返すか、returnキーワードを使って明示的にオブジェクトを返します。
class Calculator
# Positional arguments
def add(num1, num2)
return num1 + num2 # Explicit return
end
# Keyword arguments
def multiply(num1:, num2:)
num1 * num2 # Implicit return
end
end
メソッドは.構文を使って呼び出します。
calc = Calculator.new
calc.add(1, 3)
calc.multiply(num1: 2, num2: 5)
この演習では、お気に入りの料理本をもとに、最高のラザニアを作るためのコードを書きます。
4つのタスクがあり、どれもラザニアの調理にかかる時間に関するものです。
ラザニアをオーブンに入れておくべき時間を分で返す定数Lasagna::EXPECTED_MINUTES_IN_OVENを定義します。料理本によると、オーブンでの想定加熱時間は40分です。
Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40
ラザニアが実際にオーブンに入っていた時間を分で入力として受け取り、前のタスクで求めた想定加熱時間を基に、ラザニアをあと何分オーブンに入れておく必要があるかを返すメソッドLasagna#remaining_minutes_in_ovenを定義します。
lasagna = Lasagna.new
lasagna.remaining_minutes_in_oven(30)
# => 10
ラザニアに重ねた層の数を入力として受け取り、1層あたり2分かかると仮定して、ラザニアの準備に何分かかったかを返すメソッドLasagna#preparation_time_in_minutesを定義します。
lasagna = Lasagna.new
lasagna.preparation_time_in_minutes(2)
# => 4
メソッドLasagna#total_time_in_minutesを定義します。このメソッドは2つの名前付き入力を受け取ります。number_of_layersはラザニアに重ねた層の数で、actual_minutes_in_ovenはラザニアがオーブンに入っていた時間(分)です。このメソッドは、ラザニアの調理に合計で何分かかったかを返す必要があります。合計は、準備にかかった時間(分)と、その時点でラザニアがオーブンに入っていた時間(分)を足したものです。
lasagna = Lasagna.new
lasagna.total_time_in_minutes(number_of_layers: 3, actual_minutes_in_oven: 20)
# => 26