著作一覧 |
ブロックをとるという点から、どうにも難しい気がするのであった。
文字列が手元にあるなら、直接module_evalなりinstance_evalなりを呼んだ方が良い気がするし、仮にブロックがあるのであれば、それはコードの埋め込みが可能なのだから、異なるモジュールにして、その時点に適合したモジュールをミキシンすれば良いと思うのだ。
拡張ライブラリから呼び出すには便利なので、存在意義がないとは思わないが、どのようにスクリプトからは利用するのがベストプラクティスなんだろうか?(使わないのがベストプラクティスというのはない方向で)
Ruby Wayでもそのあたりは苦心していて、define_methodを呼び出すメソッドを実装したりしているが、それって、define_methodの実装意図からは違うのではないか? と思うのは、そう実装することもできたはずなのに、そうせずにdefine_methodが実装されているからだ(もちろん、応用がきくからdefine_methodなのであって、ハルフルトン方式の実装「も」できるように設計したという可能性もある)。
calss MyClass def new_method(name, &block) self.class.send(:define_method, name, &block) end end #(P.373)
おれだったらクラスメソッドにするけどなぁ
class MyClass def self.new_method(name, &block) define_method name, block # &blockとする必要はないが、何が違うんだっけ? end endRuby Way 第2版 (Professional Ruby Series)(Hal Fulton)
書き方いぱーい
module X def hello puts 'hello' end moduel_function :hello def self.ja puts 'konyanyachiha' end end class <<X def it puts 'ciao!' end end X.hello X.ja X.it
僕は、メソッド定義式の出現時点で明らかなdef self.メソッド名が良いと思うのだが、特異クラスを使う方法も捨てがたい。module_functionの使いどころはどこだろう?
define_methodしたメソッドをモジュールメソッドに変えるのに使えば良いのか。
Classからmodule_functionをundefしていることを考えると、少なくともクラスメソッドをインスタンスメソッドのように定義してからクラスメソッドに変えることは奨めてはいないのだろうけど、それはなぜだろう。
module X module_eval "def x;puts 'hello';end" instance_eval "def y;puts 'yello';end" end # X.x -> undefined method `x' for X:Module (NoMethodError) X.y class Y module_eval "def x;puts 'hello';end" instance_eval "def y;puts 'yello';end" end # Y.x -> undefined method `x' for Y:Class (NoMethodError) Y.y y = Y.new y.x # y.y -> undefined method `y' for #<Y:0x1035079> (NoMethodError)
なぜ上の結果となるか、インスタンスとモジュールの関係について言及して説明せよ。
どうでも良いことだが、次のプログラミング言語をデザインする人は、HTMLレディな標準エラー出力を考えてほしいな。オブジェクトを示すのに<>を使わないとか。
ジェズイットを見習え |