トップ «前の日記(2008-04-26) 最新 次の日記(2008-04-28)» 編集

日々の破片

著作一覧

2008-04-27

_ define_methodの使いどころ

ブロックをとるという点から、どうにも難しい気がするのであった。

文字列が手元にあるなら、直接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
end
Ruby 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レディな標準エラー出力を考えてほしいな。オブジェクトを示すのに<>を使わないとか。

_ iPod touch

BIG(期間限定特別価格盤)(メイシー・グレイ)

こんなCDもあるんだ。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|

ジェズイットを見習え