Progate Ruby メモ

<h1>学習コースⅠ 文法　変数　条件分岐</h1>

Rubyのコメントは #

<h5>Ruby2語以上の変数の組み合わせは、_ (アンダーバー)で区切る</h5>

文字列の中で、#{変数名}とすることで、変数を代入している値に置き換えて、文字列に含めることができます。
これを「変数展開」と呼びます。
<h5>ダブルクォーテーションを使った文字列の場合しか変数展開はされません。シングルクォーテーションの場合は、変数展開が行われず、そのまま文字列として出力されてしまうので注意しましょう。</h5>

変数を文字列に含める場合は、基本的に変数展開を使う

Rubyのif文は、if と end で囲む
<h5>== !=　のように、JavaScriptよりひとつ少ない</h5>

<h5>elsifをelseifと書かないように注意</h5>
elsifは必要な数だけ並べることができますが、複数の条件に合致したとしても、実行されるのは最初に合致した条件の処理のみです。そのため条件の順番を間違えると、期待した分岐がなされないことがあります。

<h1>学習コースⅡ　配列　ハッシュとシンボル　nil</h1>

each文は、「配列.each do |変数名|」と書き、「end」までの間に実行したい処理を書きます。
<h3>each文内の変数名（name）は好きな名前をつけられますが、配列の変数名（names）の単数形にすることが慣習上多い</h3>


ハッシュは、{キー1 => 値1, キー2 => 値2}のようにつくります。


ハッシュの各要素の値は、対応するキーを使って、ハッシュ[キー]とすることで用いることができます。
ハッシュ[キー] = 値と書くことで、キーと対応している値を更新することができます。

ハッシュ[新しいキー] = 値と書くことで、ハッシュに新しい要素を追加することができます。ただし、ハッシュにすでにあるキーを指定すると、要素の追加ではなく更新になってしまうので注意


ハッシュのキーにシンボルを用いるときには、省略した書き方をすることができます。具体的には「:key =>」を「key:」というように省略することができます。
<h5>省略した書き方の場合でも、あくまでキーはシンボルですので、要素を取得する場合には [:key] のようにシンボルを用いる必要があります。</h5>

<h4>「キーがシンボルの書き方（省略形）」が一般的</h4>

nilとfalseは、falseとして扱われ、それ以外はtrueとして扱われます。

<h1>学習コースⅢ メソッド　引数　戻り値　キーワード引数</h1>

引数のスコープはメソッドの中だけであると表現できます。
メソッドの中で定義した変数も、引数と同じように、そのメソッドの中（defからendまで）でしか使うことができません。


<h5>if文で使うような条件式をreturnすると、その条件式の結果として得られる真偽値（trueまたはfalse）を返すことができます。
真偽値を返すメソッドは、メソッド名の末尾に「?」をつける慣習がある（呼び出すときも）</h5>

メソッドでは、条件分岐を組み合わせることで複数のreturnを用いることができます。

引数の数が多くなると、呼び出し側で値がどの引数に入るのかがわかりにくくなります。
キーワード引数を用いた書き方をすることで、呼び出し側で引数を明記することができます。

通常のメソッドの書き方に加えて、
① 定義側で、引数の後にコロンを付ける
② 呼び出し側で、値の前に引数名を書く
とすることで、キーワード引数を持つメソッドを書くことができます。


<h1>学習コースⅣ クラスとインスタンス　インスタンスメソッド initializeメソッド　料理注文システム　ファイルの分割</h1>

クラスは「class クラス名」とすることで定義できます。
<h4>クラス名は必ず大文字で始めることと、「end」を書く必要がある。</h4>

クラスのデータを定義する方法の1つに「attr_accessor シンボル」を使う方法があります。以下の図のようにすることで、Menuクラスのインスタンスにnameという情報を持たせることができます。このnameという情報のことをインスタンス変数と呼びます。

クラス（設計図）を元に、新しくインスタンスを生成するには、「クラス名.new」とします。
また、「変数名 = クラス名.new」とすることで、生成したインスタンスを変数に代入することができます。

インスタンスに情報をもたせるには、クラスで用意したインスタンス変数に値を代入する必要があります。
具体的には「インスタンス.変数名 = 値」とすることで、そのインスタンス変数に値をセットすることができます。

クラスの中ではメソッドを定義することができます。
<h6>クラスの中で定義したメソッドは、インスタンスに対して使うようにして呼び出します。
具体的には、「インスタンス.メソッド名」のようにすることで、そのメソッドを呼び出すことができます。</h6>

<h4>インスタンスメソッドの中では、特殊な変数「self」を用いて「self.変数名」とすることで、インスタンス変数を扱うことができるようになります。
インスタンスメソッドでは、変数「self」に、呼び出したインスタンス自身が代入されています。</h4>

ここで一度、クラスとインスタンスについておさらいしましょう。
クラスは設計図のようなもので、その設計図からつくる実際の「もの」にあたるものがインスタンスです。
インスタンスが持つ情報である「インスタンス変数」と、インスタンスに対して呼び出す「インスタンスメソッド」は、クラスの中で定義します。

<h5>インスタンスを生成するのと同時に、インスタンス変数に値を代入する方法がある。
これを活用することで、インスタンスをつくるのが楽になる</h5>

まずは、インスタンスを生成した直後に処理を実行することができる、initializeメソッドというものを学びましょう。
initializeメソッドは、「クラス名.new」でインスタンスを生成した直後に自動で呼び出されます。

<h5>initializeメソッドは、他のインスタンスメソッドと同じように定義することができます。
例では、「Menu.new」でMenuインスタンスが生成された直後にinitializeメソッドが呼び出され、その中の処理が実行されます。</h5>

initializeメソッドの中で、インスタンス変数に値を代入してみましょう。
インスタンスメソッドの中では、「self.変数名」でインスタンス変数を扱うことができるので、「self.変数名 = 値」でインスタンス変数に値を代入できます。

initializeメソッドは通常のインスタンスメソッドと同じように、引数を渡すこともできます。
その際、「クラス.new」に対して引数を渡すことで、initializeメソッドにその値を渡すことができます。
<h6>initializeメソッドでインスタンス変数に引数の値を代入することで、インスタンスごとにインスタンス変数の値を変えることができます。
その際に、キーワード引数を使うことで見やすく書くことができます。</h6>

Menuクラスの定義をmenu.rbに移動させたら、menu.rbのコードをindex.rbでも使えるようにしましょう。
index.rbの一番上の行で、「require "./menu"」とすることで、menu.rbのコードを読み込めるようになります。

Menuクラスから生成したインスタンスも、配列の要素にすることが可能です。

「gets.chomp」で入力された値を受け取ることができましたが、実はこれは文字列になるため、「3」と入力しても文字列の"3"になってしまいます。
数値の計算などに用いる場合は、これを数値に変換する必要があります。
そのためには、「gets.chomp.to_i」とすることで、入力された内容を数値に変換し、計算などにも使えるようになります。

<h1>学習コースⅤ　クラスの継承 Dateクラス クラスメソッド

「class 新しいクラス名 < 元となるクラス名」とすることで他のクラスを継承して、新しいクラスを定義することができます。
継承をすると、子クラスは親クラスのインスタンス変数とインスタンスメソッドを引き継ぎます。
子クラスにインスタンス変数を追加するためには、これまで通り「attr_accessor」を用います。

親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書きすることができます。これをメソッドの「オーバーライド」と呼びます。
オーバーライドをすると、子クラスのインスタンスは親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出すようになります。

initializeメソッドもオーバーライドできる

super
オーバーライドしたメソッドの中で「super」とすることで、親クラスの同名のメソッドを呼び出すことができます。
あくまでメソッドを呼び出しているので、親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要があります。

日付を扱うためには、Dateクラスというものを用います。
DateクラスとはRubyがすでに用意しているクラスで、「require "date"」 を用いて読み込むことで、自分でクラスを定義しなくても使うことができます。
このようにすでに用意されているクラスは、requireの書き方が少し異なるので注意しましょう。
require "date"　であり、require "./date"　ではない

Dateクラスは今まで扱ってきたクラスと同様に、Date.newとすることでインスタンスを生成することができます。
引数に年月日をコンマで区切って渡して、Dateクラスのインスタンスをputsすると、下記のようにその日付を表示することができます。
2014-7-31

Dateクラスには多くのインスタンスメソッドが用意されています。
今回は、Dateクラスのインスタンスの日付が、「日曜日かどうか」を真偽値で返すsunday?メソッド

DateクラスのインスタンスをつくるためにDate.newを使いましたが、Dateクラスでは、Date.todayとすることで、今日の日付のインスタンスをつくることができるようになっています。

Date.todayのように、クラス名に対してメソッドを呼び出した
このように、クラスに対して呼び出すメソッドのことをクラスメソッドという

<h5>クラスメソッドは、「def クラス名.メソッド名」とすることで定義できます。
インスタンスメソッドとの違いはメソッド名の前にクラス名を書く必要がある点です。</h5>
今回はMenuクラスに、「is_discount_day?」というクラスメソッドを定義

クラスメソッドの中の処理を作っていきます。今回はDateクラスを用いて、今日の日付を取得しましょう。
クラスメソッドの中でもDateクラスを用いることが可能です。

インスタンスに対して呼び出すメソッドは「インスタンスメソッド」、クラスに対して呼び出すメソッドは「クラスメソッド」という.
インスタンスメソッドはインスタンスに対して呼び出す。　menu1.info など
クラスメソッドはクラスに対して呼び出す。　Menu.is_discount_day? など

クラスメソッドはクラスの中でも、同じように呼び出すことができます。