Objective-Cランタイムを使うように書き換えられたMacRubyとやらが出たそうなので試しに入れてみた。目的としては今RubyCocoaが抱えている問題の解消、およびOSXのより深い部分までRubyで扱いやすくする、ってとこなんだろうか。
何が違うの?
- 実装が1.9のものになっている(Leopard標準搭載のRuby+RubyCocoa環境は1.8.6)
- メモリ管理をObjective-CランタイムのGCを使うようにしている
- Cocoaとのブリッジ機能を使うのに特別なライブラリをrequireする必要がない
- Frameworkの読み込みはKernel#frameworkで
- 全てのRubyクラスはNSObjectのサブクラス
- もっといろいろ違うとこあるんだろうけど、まだちゃんと見てないのでこんな感じ。
例えば、現行のRuby+RubyCocoaだと、
require 'osx/cocoa' OSX.require_framework 'coredata' class AppController < OSX::NSObject # ほげほげ end
とかしてるところを
framework 'coredata' class AppController # もともとNSObjectのサブクラス end
と書けるようになってた。
ObjectがNSObjectのサブクラス
Rubyの全てのクラスはObjectクラスから派生しているのだけど、MacRubyではNSObjectがObjectクラスのスーパークラスになってた。
$ ruby --version ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0] $ irb >> Object.ancestors => [Object, Kernel] >> require 'osx/cocoa' => true >> OSX::NSObject.ancestors => [OSX::NSObject, OSX::OCObjWrapper, OSX::NSKeyValueCodingAttachment, OSX::NSKVCAccessorUtil, OSX::ObjcID, Object, Kernel]
$ ruby --version MacRuby version 0.1 (ruby 1.9.0 2008-02-18 revision 0) [i686-darwin9.2.0] $ irb >> Object.ancestors => [Object, NSObject, Kernel] >> NSObject.ancestors => [NSObject, Kernel]
ということはつまり、MacRubyでは全てのクラスはCocoaのクラスであって、RubyCocoaで言うところのOSX::NSObjectから使えるメソッドが全てのクラスで使えるということか。しかしObjectよりNSObjectのが上位にあるってなんか気持ち悪いなぁ、ちょっと。
実装はあとで見る
Objective-Cってことなんでソースが.mのファイルがいっぱいあるんだと思ったんだけど、流石にそういうわけではなくて(Objective-Cで全面書き直ししたわけではなくて)、大体普通のRuby1.9っぽかった。まぁそりゃそうか、わざわざObjCで全面書き直しする意味もないよなぁ。あとで何がどう違うのかちゃんと見てみよう。読める範囲で。