Skip to content

Instantly share code, notes, and snippets.

@osyo-manga
Last active October 2, 2020 11:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save osyo-manga/6863de554b66c0230b2bf86cedac0600 to your computer and use it in GitHub Desktop.
Save osyo-manga/6863de554b66c0230b2bf86cedac0600 to your computer and use it in GitHub Desktop.

Reject Refinements

自己紹介

Refinements を使う理由

  • 安全にクラス拡張を行う
  • 適用されるクラス拡張の範囲を制限できることができるので名前衝突などが起こりづらい

Refinements を使うケース

  • 新しい名前のメソッドを安全に定義する
    • メソッドが適用できる範囲をユーザが制御できる
    • 仮に他のメソッドと名前衝突を最小限に抑えられる
  • 既存のメソッドの挙動を変える
    • 既存のコードに手を入れる事なく任意のコンテキストの範囲のみのメソッドの挙動を変える事ができる
    • ダックタイピング的な用途で使う
  • 完全 private メソッドを定義する

Refinements を使ってみる

  • ライブコーディングするよ
  • 簡単な使い方
  • 適用範囲の説明
  • 完全 private メソッドとは?

ここがつらいよ Refinements

  • 以下のメソッドでも Refinements は反映される
    • #respond_to?
    • #public_send
    • #method
  • 以下のメソッドは Refinements が反映されない…
    • #methods
    • #instance_methods
  • ダックタイピング的に呼び出せない
    • to_s を拡張しても puts 呼び出しで反映されないよ…

実際に Refinements を使ってる例を見るよ!

これからの課題

  • ケースによっては using するのが手間な事がある
    • デバッグ用の機能とかファイル毎で using するのがだるい
  • ダックタイピングに無力
    • using したコンテキストで呼び出される場合のみ適用される
    • 間接的に呼び出される場合に適用できない
  • 制限がきつい

まとめ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment