znzの日記

2007-04-02

spamコメント

spamコメントが来てたので、設定を変更したり削除したりした。

ついでにRSSフィードの設定に気づいたので、RSSフィードに全文を掲載するという設定に変更した。

2007-01-12

[] extend

tDiary-develでextendを使えばいいと言うだけで、extendについての説明をしなかったので、ERB::Util.hをクラスメソッドで使いたい場合のextendについての説明です。

module Hoge
  def hoge
    puts "hoge"
  end
end

というmoduleがあったとして、obj.extend Hogeというのは

def obj.hoge
  puts "hoge"
end

と同じようなもの。

class Foo
end
foo = Foo.new
foo.extend Hoge

なら

def obj.hoge
  puts "hoge"
end

相当。

class Bar
  extend Hoge
end

ならextend Hogeの部分はself.extend HogeBar.extend Hogeと同じなので

class Bar
  def self.hoge
    puts "hoge"
  end
end

相当になる。

2006-10-21

mputの日記- RubyConf2006 一日目

mputの日記。 - RubyConf2006 一日目で見つけたtypoらしきものとか。

create_makefileのかわりにMkrf::Generator.newはどうかと思うのだが……なんでこっちの人はこんなにイテレータが好きなの?

テストが書きやすいから?

2006-10-17

YAMLでRPC

http://subtech.g.hatena.ne.jp/secondlife/20061012/1160641587 を見てちょっとやってみたら、例外のmessageがちゃんと復元されなかったので、作りかけでやめてしまった。

インスタンス変数が復元できない」とか書いてるけど、YAML.dumpしてYAML.loadすると普通はちゃんと復元される。

メッセージの形式はメソッド呼び出しがハッシュのキーにメソッド名で値に引数YAML.dumpしたものを"\0"終端で。gets("\0")というのはRailsChatのまね。

返値はメソッドの返値か例外が発生した場合はその例外をYAML.dumpしたものを"\0"終端で。

続きを読む

例外のmessageが戻らない

YAML.dumpされた中にはちゃんとメッセージが入ってるのに復元されないと思ったら、@mesgというインスタンス変数に入ってしまっていた。

require 'yaml'
yaml = YAML.dump(StandardError.new('hoge'))
p yaml #=> "--- !ruby/exception:StandardError \nmessage: hoge\n"
e = YAML.load(yaml)
p e.message #=> "StandardError"
y e
#=>
#  --- !ruby/exception:StandardError
#  message: StandardError
#  mesg: hoge
p e.instance_eval { @message } #=> nil
p e.instance_eval { @mesg } #=> "hoge"

2006-10-11

ENDat_exitの違い

http://www.atdot.net/~ko1/diary/200610.html#d10 を見てENDat_exitの違いが気になったので調べてみる。

続きを読む

rubyソースを読んだ編

  • まず grep END *.* してみたらヒットしすぎ。
  • grep END lex.c parse.yというあたりで探してみるとklENDらしいとわかる。
  • parse.yのklENDのところをページャーで見てNEW_POSTEXEがポイントっぽい気がしたので、
  • grep NEW_POSTEXE *.*で「node.h:#define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0)」
  • grep NODE_POSTEXE *.*eval.cを見れば良さそうと気づく。
  • eval.cのcase NODE_POSTEXEでrb_f_END()が実際の処理っぽい。
  • grep rb_f_END *.*してみたら、eval.cの中にrb_f_ENDがあった。
  • 肝はrb_set_end_procっぽい。すぐ下にrb_f_at_exit()があって、その中でもrb_set_end_procを呼んでいる。
  • rb_set_end_procの仲まで見ずにENDat_exitで登録したブロックは別々のリストではなく混ざったリストで実行されるらしいとわかる。

ENDが使えないところ

class END # syntax error
end
END() # syntax error

ENDが使えるところ

class Hoge
  def END
    puts "END method"
  end
end
Hoge.new.END() # レシーバがないと呼べない