bar_1

contents_map

2017年11月19日日曜日

[Ruby]モジュールに継承/派生っぽいことをさせてみる試み

組み込みライブラリもしくは既存のクラスclassやモジュールmoduleを, 特定の用途向けに一部だけ改変したいことがある. その際, できればモンキーパッチはしたくない.
このような場合, クラスならば class DerivedKlass < OriginalKlass として継承を使える. 派生クラスを作ることで, 元のクラスのコピーを作り, それを改変すればいい.
ではモジュールの場合は, どうしたらよいだろう? ここでは, Mathを取り上げて考えてみる.
最初に, include/extend/refineという既存の方法の検討をおこない問題点を明らかにする. 次に, これらの問題点を解決する Module#module_compose の導入を提案する.

2017年11月16日木曜日

Rubyの実験: Moduleのprivateインスタンスメソッド

Moduleのprivateインスタンスメソッド, 具体的にはModule::module_functionのふるまいで, 腑に落ちない点があった. 派生先のClassクラス (ひいては一般に定義されたクラス) からなぜ使えないのか? ということで, 実験した. 結論的には 仕様だった, という落ちでした……w

2017年11月8日水曜日

Rubyの実験: Object/Class/Module/Kernelにメソッドを追加するとどうなるか?

Object/Class/Module/Kernelにメソッドを追加すると, これらや一般のクラス, モジュールやインスタンスに対してどのような影響があるか, 調べるコードを書いてみた. 追加するメソッドはインスタンスメソッドと特異メソッドで, 両方publicの可視属性です.

2017年11月2日木曜日

つぶやき日記2017-11-01 Rubyでいくつか調べていたこと



  • ModuleやClassのインスタンスメソッドの可視性の相違 (例えば Object#extendとModule#includeはパブリックインスタンスメソッド,かたやModule#public/protected/privateはprivateインスタンスメソッド) について.どうやってpublicとprivateを使い分けているのだろう? 思想がよくわからない……外側から使えるか否かなのかな.
  • public/protected/privateは,実は予約語ではない.Moduleのprivateインスタンスメソッドである.このようなメソッドはRuby自前で書けるか? 答え: 書けない.引数を与えない場合の記述が問題になる.仮にdefを再定義できるならば可能となる (defは予約語である).
  • 強引に書きたい場合は,https://stackoverflow.com/questions/28055356/determining-methods-visibility-on-the-fly が参考となる.defに代わるメソッド定義メソッドを用意することになるだろう.