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の可視属性です.

2014年12月24日水曜日

[Ruby]シンボルとコードブロックからクラスを動的に定義するメソッド: class_define

Ruby では Class.new で無名のクラスオブジェクトは生成することができる。
このとき
  • クラス名
  • クラス本体
を与えて、動的にクラスを作れないか?を考える。

2013年8月4日日曜日

[Memo]private メソッドへのアクセス

Ruby は、クラスのメソッドのデフォルトのアクセス制限が、 public なんだけど、ほっとくと public ばかりになってしまう。そこで整理のためにアクセス制限をしたいとなると、テスト容易性 (testability) に差し障る。

まぁ、そういった場合は send を使えばいいのだけど。

>> class Foo
>> private
>> def foo; p "foo"; end
>> end
=> nil
>> n=Foo.new
=> #
>> n.foo
NoMethodError: private method `foo' called for #
from (irb):6
from /Users/honyarara/.rbenv/versions/2.0.0-p247/bin/irb:12:in `'
>> n.send(:foo)
"foo"
=> "foo"


C++だったら、ここらへんどうあつかったらいいのかな。。。『メタプログラミングRuby』は、オブジェクトモデルを骨子に据えて、 Ruby におけるメタプログラミングのデザインパターンを、シナリオ風に提起したもので、とてもよかったです。