[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 を呼び出すにはどうするんだっけ?
続く...。
| 固定リンク
この記事へのコメントは終了しました。
コメント