30DAYSトライアル4th

30DYASトライアル4th(Rails)のまとめ【DAY5】

4thのDAY5は「ミニツク 演習 1~3」になります。

前回でProgateでの学習は終了したので、次は実践です。インプットしたら必ずアウトプット(実践)。アウトプットしなければ成長はありません。

演習1

処理自体は作成したものの、実行結果にアドレス的なものが出力されるのと、模範回答と照らし合わせた時に「<<()」という謎のメソッドが出てきてました。 正直「演習1からこんな感じかよ・・・」思ってしまいましたね。 必ずしも模範回答どおりのコードにする必要はありませんが、模範回答がなぜそのようなコードなのかという理由はきちんとおさせておくべきですね。 またそれ意外にも新たに知ったことが出てきたので、備忘録として残しておきます。

<<()メソッドについて

Rubyは演算子はただのメソッドにすぎず、オーバーライド可能というびっくりな仕様があるようです。

僕が参考にさせてもらったRuby | 再定義できる演算子 で組み込み演算子風のメソッドを定義する #rubyにも書かれていますが、普通に記述する演算の式はメソッドを呼び出す構文のシンタックスシューガー(元々の分を簡易的に記述できるようにしたもの)とのことです。

このことから「<<()」メソッドは配列の最後尾に追加するというメソッド(演算子)をオーバーライドしているということになります。 僕はこのメソッドを普通のメソッド名にしてしまいましたが、「配列の最後尾に要素を追加する」というのも元々「<<」の機能なので、それをオーバーライドして作成すべきということなんでしょうね。

joinメソッド(Arrayクラス)

配列に格納された値を出力するためにeach文を使用して1要素ずつputsしましたが、模範回答では配列を管理するクラスである「Arrayクラス」の「joinメソッド」が使用されていました。

joinメソッドの構文は以下のとおりで、引数に区切り文字を指定することで配列の要素を指定された区切り文字を間に挟み連結してくれます。

to_sメソッドについて

to_sメソッドを実行しないのに何故to_sメソッドが実行されるのか?ここが分かりませんでしたが、【Ruby】表示メソッドについて (print, puts, p)により解決しました。

表示メソッド(print、puts、p)は文字列以外のオブジェクトが指定された場合、内部的にそのオブジェクトのto_sメソッドが実行されて出力されます。そしてそのto_sメソッドはオーバーライド可能。

これを利用して該当のオブジェクトにto_sメソッドを用意すれば、表示メソッドを使用した場合に自動的に自分で用意したto_sメソッドが実行されるというわけです。

演習2

かなりゴリゴリとやっちゃいましたが、まずは実現できることが大事。

というか模範回答のコードは「Stringにはto_aメソッドないよ〜」ってエラーになるんですけどね・・・。

演習2での新登場ポイントは「可変長引数」と「to_aメソッド」です。

可変長引数

引数に「*」を指定することで、引数の数を可変にできます。この場合引数は配列となります。

また引数に「**」を指定するとオプション引数となり、引数の数を可変でハッシュで受け取ることができるようになります。

これは便利ですね。

後々仕様が変更になる可能性があるメソッドの引数とか全部この可変長引数かオプション引数にしてしまいそうです。

to_aメソッド(Arrayクラス)

Arrayクラスのto_aメソッドはレシーバー自体を返します。

またHashクラスのto_aメソッドはハッシュを配列に変換して返します。

今回の演習では引数に配列とハッシュが渡ってくるので、このto_aメソッドを利用して処理を共通化してるんですね。

演習3

演習3は特に目新しいことはなかったので特に問題ありませんでした。

強いて言うなら演習1もそうですが、to_sメソッドでputsで終わると、そのオブジェクトのアドレス?的なものが出力されてしまうっていうところですね。

これはputsのメカニズムをもうちょっと調べる必要がありますが、とりあえず先に進もうと思います。

感想・まとめ

Progateのrubyを完了しただけでは結構厳しいんじゃないかなと思います。

模範回答を見ても「@」とかいきなり出てきて「?????」ってなりますしね。

僕は一旦ドットインストールの「Ruby入門」コースを学習してからトライしましたが、それでも分からないことだらけでしたし。

僕がProgateとドットインストールで学習した内容のまとめ。

とりあえず考えても分からなくても悲観することなく、模範回答を見てみて分からないところはググってコードの意味や何故そうしているか?というところを考えれたら良いと思います。

分からないからといって投げ出してしまうと成長はありませんから。

ABOUT ME
Jyu2
【PC1台で稼ぐブロガー兼Webエンジニアを目指し中】IT情報やWebサービス、アプリなどの情報を発信/SIerで10年以上勤務→ストレスMAXで休職中→ブログとWebの学習を行い脱サラ計画中/ #30DAYSトライアル 1st完了→2nd実施中 / 日々の学習内容をブログにアウトプット / まずは月収5万円を目指す