10日目
今日の学習
Ruby
クラス
クラスの用語や定義、なぜそうするのかの理解を深めるために、単語を一つ一つ流さずに見ていく。
クラス定義をテンプレートで覚えてしまったせいで、何でattr_accessor
を使っているのか?メソッドはなぜ設定しているのか?という点を曖昧にしたままであったのが良くなかった。
インスタンス変数
以下、こちらの記事から引用。
Rubyのインスタンス変数を使用例をもとに現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
インスタンス変数
とは、インスタンス毎に別々の値を保持できる変数
そして、
インスタンス変数
はオブジェクトの外からアクセスできないため、クラスにメソッドを定義する必要性があります。
その定義したメソッドを通じて、インスタンス変数にアクセスするということとなります。
クラス(設計図)
から作成されたインスタンス(オブジェクト)
ごとに、情報を保持できる変数ですよ〜ということになる。
各インスタンス
ごとに情報を保持したいなら、インスタンス変数
を作る。作り方は、@変数名
とする。
クラスの中ではなんとなく@をつければいいんだな、と考えてしまっていたので、酷い解釈の仕方だったと思う。
車Aの色は赤色、車Bの色は青色にしたいとして、車クラスから作成するときは、車ごとに色を変えたいので、@colorとする...といった具合か。
これまでに習った教材にも、当たり前のように上記のことは書いてあるのだが、いかに自分が雰囲気で学習を進めていたかがよく分かった...。お恥ずかしい限りである。
initialize
さらに、なぜクラスにメソッドを定義するのかについても理解できた。
このメソッドとして利用するのが、initialize
メソッドという理解で大丈夫だろうか。
initialize
メソッドについて、再び記事からの引用。
インスタンス生成の時に初期値として入れる値を定義したメソッド
まずはinitialize
メソッドにて、引数を利用してインスタンス変数
を受け取る。
そして、受け取った後にクラス内のメソッドに渡すことによって、各インスタンスに応じた処理になる。
アクセサ
attr_accessor
について理解するには、そもそもセッターとゲッターが存在する理由を知っておかなければならない。
外部から@変数
に値を代入するものがセッター
、外部から変数に代入された値を取り出すものがゲッター
。
これがないと、そもそもインスタンス変数
に値を代入したり、値を取り出すことができない。
全然関係ないが、セッター
は
def name=(name) @name = name end
と、name=(name)
の辺りが普段のメソッドでは見かけない形になっていて気持ちが悪い。
【Ruby】 | Pikawaka - ピカ1わかりやすいプログラミング用語サイト
こちらの記事によると、
メソッド名の末尾に=(イコール)をつけると、代入式のようにメソッドを呼び出すことが出来ます。
ということらしい。?????メソッドを呼び出しながら代入するときにイコールをつけるんだろうか。
とにかく、アクセサ
は外部からアクセスするために必要不可欠なものである。クラス外で使用するために必要だ。
しかし、アクセサメソッド
が必要な場合、そうでない場合の差があまり分からない。
要は、インスタンス変数
を含んでいるinitialize
メソッド以外のメソッドを経由していればOKなのだろうか?
まとめ
おぼろげながらも、昨日よりは確実にオブジェクト指向まわりを理解できたように思う。
インスタンス変数
とは、インスタンス毎に別々の値を保持できる変数。@変数名
で作成インスタンス変数
には、クラスで定義したメソッドを通じて外部からアクセスするinitializeメソッド
にて、インスタンス生成の時に初期値として入れる値を定義
(キーワード引数
を使用する事で、どのような引数を渡しているのか明白にする)アクセサ
を用いて、外部からインスタンス変数
にアクセスするattr_accessor
メソッドでは、文字列かシンボルを用いて読み取りたいインスタンス変数名
を指定- 書き換えられたくないものは
attr_reader
のみで定義をする
そして、先日作成したクイズのプログラムを改めて見てみると、attr_accessor
を使っているにも関わらず、下の方に改めてゲッター
を設定するというとんでもない無駄行為に及んでいることが分かった。すげー恥ずかしい。
attr_accessor
も、一行にまとめられるのに3行にまたがって書いてあるし……。気づいていないだけで、他にも改善点がありそう。
そして、昨日できなかった課題も、求められている出力結果を出せるようになった!よかった。
リファクタリング case文
case文
を作成し、case文
の中で変数を定義していたが、case文
自体を変数に代入できるという方法を、やんばるエキスパートのあやね様に教えていただいた。
case user.age when 0..5 fee = @entry_fee[:infant] when 6..12 fee = @entry_fee[:children] when 13..64 fee = @entry_fee[:adult] when 65..120 fee = @entry_fee[:senior] end
このように、入場者の年齢によって、入場料金を決めたい。
変数fee
が何度も出てくるが、case文
自体をfee
に代入することにより、大幅に見やすくなった。
fee = case user.age when 0..5 @entry_fee[:infant] when 6..12 @entry_fee[:children] when 13..64 @entry_fee[:adult] when 65..120 @entry_fee[:senior] end
どのようにして無駄な部分を省くか、重複を避けられるか、非常に勉強になった。
Ruby on Rails
デバッグツール(binding.pry)
pry-byebugの基本的な使い方を学習。
Railsは、
ルーティング → コントローラ → ビュー
という流れで処理をしていることをしっかり理解する。
デバッグの練習をしてみたが、binding.pry
を用いて原因を絞っていくのが難しい。
処理の流れを理解できておらず、この段階ではこの情報が入っていないとおかしい、と論理的に考えられていないからだろう。
あとは、複数形であるかどうか、ルーティングはどうなっているのかの理解を徹底しなければならないと強く感じた。
やんばるエキスパートにてメンターをして下さっているたけ様の動画。一つずつ丁寧に解説されていて、非常に分かりやすかった。
エラー文をコピペして検索をよくやってしまっていたので、英単語ひとつひとつとしっかり向き合っていく。
学習メモ
- ハッシュの値は
変数[:キー]
の形で取り出す form_with
でのリクエスト先は、model
の部分で自動生成している