きりかノート 3冊め

おあそびプログラミング

メモ: RubyCocoa でのカテゴリやプロトコルのとりまわし

rubycocoa-talk への返答を書いている間に思いついたことのメモ。

ML に投げたように、addRubyMethod:withType: を利用すれば解決可能な問題ではあるけれど、

  • メソッドひとつずつについて書く必要がある
  • 型情報を自分でつくらないといけない

というあたりがコード書く際のネックになりそう。メソッド名や型情報をまちがえたらアウトなのだ。そういうのはニンゲンには向いていない。

Objectice-C のランタイムは、カテゴリや非定型プロトコルとして、セレクタや型の情報を持っているのだから、それを利用すれば簡単に処理できるんじゃないかと考えた。

こんなでどうだろう?

雰囲気としてこんな動作かな。メソッド名はてきとう。

 OSX::OCProtocol.import :SomeProtocol # => define OSX::OCProtocol::SomeProtocol

class MyClass < OSX::NSObject

ns_confirm OSX::OCProtocol::SomeProtocol # allow informal protocol

# automatically invoke addRubyMethod:withType: via method_added
# when the name of method matches any method of the protocol
def sel_msg(a, b)
end

end
 cat_delegate = SomeClass.category[catname]
OSX.ns_handle_signature(cat_delegate) # add selector/signature to DummyProtocolHandler

後者についても、本来なら NSObject クラスに ns_confirm すれば意味的には同じになるはずなんだけど、現在の RubyCocoa の実装では継承関係がないから、そうもいかず。

考えてみると、セレクタと型情報しか持たないなら、ただの Hash でもよさそう。登録操作に与えるものとして Hash を使ってもいいかも。もし実装されるとしてもだいぶ先だけどね。