tawara's blog

雑記。個人の見解です。

チェリー本の第7章クラスを復習した。

クラスの復習をしている。超マイクロアウトプット

  • クラス内にて、メソッド内でインスタンス変数の属性をセットする(更新)する際にはselfをつける必要がある。でないとローカル変数を格納するだけになり、期待した結果を得られない。

なんとなくでいつもselfをつけているので、すっきりした。更新するときはselfが不可欠なのだ。

  • attr_accessorって何をしてるんだっけ? インスタンス変数の指定した属性に対して読み書きするメソッドを追加できる。

公式の説明はわかりやすい。 Module#attr_accessor (Ruby 3.1 リファレンスマニュアル)

  • 既存の実装を上書きして期待する挙動に変更することを「モンキーパッチ」と呼ぶ。

なるほどー。説明が簡潔でわかりやすい。

  • 特定のオブジェクトにだけ紐づくメソッドのことを特異メソッドと呼ぶ(英語だとsingleton method)。

なるほど!Rubyのリファレンスマニュアルにある特異メソッドとは、そのクラスオブジェクトのみが持っているメソッドのことを指しているのか。と閃いた次のページにそのものズバリが解説されていた。昔読んだ記憶が喚起されただけなのかもしれない。

  • コードを実行する瞬間のみにRubyは関心がある。そのメソッドが呼出せるか否か?と。ゆえに(?)、データ型をチェックしたりしない。オブジェクトのクラスが何であろうが、メソッドが呼べるかどうかのみを気にするプログラミングスタイルのことを「ダックタイピング」という。なのでモジュールやスーパークラス内に存在しないメソッドを書くことも可能。モジュールを取り込む側や継承先のコードに、そのメソッドがあればいい。

ということはつまり逆の観点だと、静的型付け言語は(goとかtypescript?)ダックタイピングではないことになる。例えばモジュール内に存在しないメソッドを呼んだりはできないのかな。

  • (8章)inculdeすると、モジュールのメソッドをインスタンスメソッドとして使える。一方で、extendすると、モジュールのメソッドをクラスメソッドとして使える。

もやもやしてたことが腑に落ちた。このへんは初学者の頃に読んでもあまり実感をともなった理解にいたれなかった思い出があるので、すっきりしてよかった。

(了)