koheitakahashiのブログ

2020.07.01にプログラマーとして生を受けた私が学んだことや、日常について徒然に書いていきます。

Grow.rbに初参加させていただきました

はじめに

これから、自分はどんなエンジニアとして生きていきたいのか、そもそもどんな会社に就職したいのかということを、形作っていくために、現在、できる限り色々な勉強会に参加しています💪

今回は第7回Grow.rbに初参加させていただきました(勉強会参加は通算3回目)。

growrb.doorkeeper.jp

テーマは「メタプログラミング」でした。

参加させていただいた感想と、学んだことをまとめたいと思います。

感想

再び自分のできなさを痛感

11月18日に参加したSendagaya.rbでも自分のできなさを痛感したところではありますが、再び痛感することとなってしまいました(詳細は以下の記事)💦

nmp300.hatenablog.com

今回の勉強会は問題形式だったため、その痛感度合いが半端じゃなかったです💦

これまで全く知らなかったメソッド、クラスがザクザク出てきて、「これは何をやっているのか・・・🥶」、「自分が勉強してきたRubyとは一体・・・💦」と、勉強会中はただの置き物になってしまいました。

ただ、やはり自分のできなさを痛感することで、今後のモチベーションになりました。格好よくRubyを操っている皆さんを見て、「自分もあんなレベルになりたいなー」と思うようになりました🔥

優しいエンジニアの方々が多い

自分の観測範囲だけですが、本当に優しいエンジニアの方が多いなーと思いました。

今回は勉強会の後に懇親会が行われたのですが、そこで、自分は「どのようなエンジニアになりたいかが曖昧だということ」、「そもそもどんな会社に就職したいのかということが今の段階でないこと」を相談させていただきました。

そしたら、近くに座っていたエンジニアの方々がアドバイスをしてくださいました。

「エンジニアとしてのモデルは3つくらいあり、技術一筋の人、技術とビジネスの仲立ちができる人、マネージメントができる人。とりあえず、業界に入ってみて、自分の合っているものを徐々に見つけていければ良いのでは?🤔」

「最初の就職を失敗したくないという気持ちよりも、転職も視野に入れて、キャリアを考えても良いのでは?ネットワーク理論によると2回ネットワークを変えると、自分に最適化できるって‼️」

などなど、非常に多くの金言をいただくことができました。

そして、自分は私はどこか、最初の就職について強く気負っているのではと気付きました。

色々なキャリアがあると改めて知ることができました。もっと、気負いをなくして、自分の興味・関心にしたがって良いのだと思いました💪

学んだこと、勉強会後自分で調べたこと

感想だけをまとめていては、自分の技術レベルが向上しないと思ったので、学んだこと、勉強会後に自分で調べたことをまとめたいと思います。

モジュールの使い方の違い

rubyにはmoduleを使用する方法として、includeやprependを使うという方法があります。

includeとは

例えば以下のように、bodyという文字列をcreateできるBodyモジュールを作ったとします。そして、Carクラスを用意しました。Carクラスはincludeすることで、以下のように、Bodyモジュールで定義されたメソッドを使えるようになるわけです。

module Body
  def create
   puts "body"
  end
end

class Car
  include Body
end

Car.new.create
#=> body

prependとは

もう一つ、prependというものがあります。これは、includeと似ているのですが、違う点として、そのprependを実行したクラスを上書きするとうい特性があります。

例えば以下のように、createというメソッドがCar2クラスにも定義されている時、同じくcreateメソッドが定義されているBodyモジュールを使用すると、Car.new.createの結果はBodyモジュールのcreateメソッドになるわけです。

つまり、BodyモジュールがCar2クラスを上書きし他のです。

module Body
  def create
   puts "body"
  end
end

class Car2
  prepend Body
  def create
    puts "car2"
  end
end

Car.new.create
#=> body

優先順位も違う?

前述したように、両者は上書きするかどうかが違いますが、継承の優先順位も違うということが挙げられます。

具体的にはincludeした時は、includeを行ったクラスの上になり、prependした時は、prependしたクラスの下になります。以下のように、Car3クラスと、Car4クラスを定義しました。

class Car3
  include Body
end

class Car4
  prepend Body
end

これを、クラス、モジュールのスーパークラスとインクルードしているモジュールを優先度順に返してくれるancestorsメソッドを使ってみてみると

Car3.ancestors
#=> [Car3, Body, Object, Kernel, BasicObject]

 Car4.ancestors
#=> [Body, Car4, Object, Kernel, BasicObject]

のように、優先順位が異なります。includeを行ったクラスの上に呼び出され、prependした時は、prependしたクラスの下になるわけです。

最後に

正直全く分からなかった、今回の勉強会ですが、自分なりにこうやって振り返ってみると「こういうことだったのか」という少しだけ理解することができた感じがします💪

メタプログラミングは全然、知らなかったのですが、これを機にメタプログラミングRuby 第2版を読んでみようと思います

Grow.rb関係者の皆さんありがとうございました🙇‍♂️

参考にさせていただいたサイト

[Ruby] モジュールの include と prepend-[1] - Qiita