« [Ruby] COM と STA と MTA | トップページ | [Ruby] Thread#initialize の再定義(その2) »

2010年1月23日 (土)

[Ruby] Thread#initialize の再定義(その1)

Win32OLEとThreadの話
でThread#initialize を再定義するという話が浮上してきた。


いきなり、Cで実装しようとして再定義のやり方がわからなくてハマる。
(rb_call_super を使おうとして、それは間違いであることに途中で気づいた。)


という訳で、基本に戻って(?)、Rubyレベルでの再定義からやってみる。


class Thread
alias :org_initialize :initialize
def initialize(*arg)
puts "OleInitialize call"
org_initialize(*arg)
end
end
t = Thread.new{puts "in thread"}
t.join

実行してみたら


OleInitialize call
a.rb:5:in `org_initialize': must be called with a block (ThreadError)
from a.rb:5:in `initialize'
from a.rb:8:in `new'
from a.rb:8

となってしまった。


class Thread
alias :org_initialize :initialize
def initialize(*arg, &block)
puts "OleInitialize call"
org_initialize(*arg, &block)
end
end
t = Thread.new{puts "in thread"}
t.join

これで、


OleInitialize call
in thread

となった。


えーと。
Cで実装するときは、alias は、rb_define_alias を使えばいいとして、
block つきで org_initialize を呼び出すにはどうするんだっけ?


続く...。

|

« [Ruby] COM と STA と MTA | トップページ | [Ruby] Thread#initialize の再定義(その2) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [Ruby] Thread#initialize の再定義(その1):

« [Ruby] COM と STA と MTA | トップページ | [Ruby] Thread#initialize の再定義(その2) »