SyuchiNikuRingの備忘録

お勉強したことをまとめておく場所。中の人の理解や感覚で書いているから不正確なことも多いかも。

Ruby入門season3~クラス~

やっほー。今回はクラスに関してまとめます。前回はメソッドをまとめたので自然な流れですね。

 

基本的な考え方や定義の仕方はJavaと同じです。

中の人の好物である茶碗蒸しでクラスを作りました。

f:id:SyuchiNikuRing:20180908081806p:plain

Rubyのクラスはclass / endで定義します。クラス内のインスタンスはattr_accessorで定義します。インスタンスの先頭に「:」が付くので忘れないようにします。

インスタンスの生成は、クラス.newです。Javaによく似ていますね。(Javaはnew クラスでした。)

インスタンスに値を入れるときは、(オブジェクト).(インスタンス)とします。

先ほどのプログラムを実行します。

f:id:SyuchiNikuRing:20180908082201p:plain

うまくいきました。

クラスの中でメソッドを定義していきます。

f:id:SyuchiNikuRing:20180908084230p:plain

Javaとほとんど変わらないですね。実行してみます。

f:id:SyuchiNikuRing:20180908084313p:plain

menu1とmenu2に対してメソッドが確かに呼び出されています。インスタンスに対して呼び出すメソッドをインスタンスメソッドといい、インスタンス変数というものがあります。self.変数とすることで先ほど生成したインスタンスに代入した値をインスタンスメソッド内で呼び出せます。

 

f:id:SyuchiNikuRing:20180909104145p:plain

 

実行します。

f:id:SyuchiNikuRing:20180909102517p:plain

 いい感じですね。

ところで、ここまで①クラスを作ってから②インスタンスを生成し、それから③インスタンスに値を入れるという手順でやってきました。Javaでも同じことをしていましたが、Javaには②③をまとめてできるコンストラクタというものがありました。Rubyにも同じ機能はないのでしょうか。

ちゃんとあります。initializeメソッドといいます。実際にコードを見てみましょう。

f:id:SyuchiNikuRing:20180909114630p:plain

6行目から9行目にかけてinitializeメソッドが定義されていて、インスタンスの定義と値の代入を同時に行っています。そして、23行目でインスタンスmenu1に対してorderメソッドを呼び出しています。orderメソッドを呼び出したとき、まず実行されるのがinitializeメソッドです。ここでインスタンスとその値を受け取り、それをorderメソッドに渡しています、実行結果を見てみましょう。

f:id:SyuchiNikuRing:20180909115056p:plain

うまく出ました。orderメソッドの結果は一行目に出ている通りです。

とはいえ、これではinitializeメソッドで値を代入しているので、呼び出す度にいつも同じ値が呼び出されてしまいます。そこで、initializeメソッドに引数を渡すことで様々な値に対応できるようにしましょう。

f:id:SyuchiNikuRing:20180909120430p:plain

5行目から9行目までのinitializeメソッドではインスタンス変数に引数を渡しています。

その引数は23行目でキーワード引数を用いて具体的な値を代入されています。ここの値を変えれば、キーワード引数に紐づいているメソッドの出力は全て変更できます。

さて実行結果を見てみます。

f:id:SyuchiNikuRing:20180909121009p:plain

うまくいきました。お土産高っ…