7月25日にオンラインで開催された Tama.rb #21 に初めて参加した。
参加者は20名弱で、ツールはSpatial Chat。全員の自己紹介のあと各自好きなところに移動して自由に話す形式で、私は Ruby のところへ行ってみた。
Ruby にパッチを投げたりしているという強いエンジニアの方がいらっしゃって、いろいろお話を聞くことができた。
継承とミックスイン
まず、継承の話。自分でクラスを作ると、Object が継承される。Object は、Basic Object を継承している。
class NewClass end
上のようにNewClass というクラスを作って、祖先(ancestors)を見てみると、下のようになる。
NewClass.ancestors #=> [NewClass, Object, Kernel, BasicObject]
Rubyではすべてがオブジェクトなので、Object と Basic Object を継承しているのは知っていたが、Kernel
がこんなところにあることは意識していなかった。
module Kernel (Ruby 2.7.0 リファレンスマニュアル)
Kernel はクラスではなくモジュールで、Object にインクルードされている。puts
やchomp
など見慣れたメソッドの数々は Kernel のメソッドだ。
class NewClass include SomeModule include NewModule end
NewClass.ancestors #=> [NewClass, NewModule, SomeModule, Object, Kernel, BasicObject]
同名のメソッドがある場合、左から順番に探索されるので、順番は大事。module を複数インクルードしたときは、後に書いた方が優先される。
include
の代わりにprepend
を使うと、self を module でオーバーライドすることもできる。知らなかった。
class NewClass include SomeModule prepend NewModule end
NewClass.ancestors #=> [NewModule, NewClass, SomeModule, Object, Kernel, BasicObject]
Module#prepend (Ruby 2.7.0 リファレンスマニュアル)
副作用のあるコードとは
話の中で「副作用のあるコード」というワードが出てきた。聞いたことはあったが、いまいちどういうコードを指すのかわからなかったので、詳しく聞いてみた。
簡単に言うと、メソッド名などから想像できないような予想外の動きが含まれているものや、インスタンス変数の値を書き換えるなど状態を変更するようなコードのことだと理解した。
感想など
勉強会に参加すると、自分一人では考えないようないろんなことを考えるきっかけになったり勉強になる話が聞けたりしてとても面白い。Tama.rb は比較的女性も多く、和気あいあいとした雰囲気で楽しかった。
初学者にRubyがおすすめなのはコミュニティが優しいからだと聞いたような聞いていないような気がするが、本当に皆さん優しくてこんな初心者の話に付き合ってくださってありがたい限り。また参加したい。