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で全面書き直しする意味もないよなぁ。あとで何がどう違うのかちゃんと見てみよう。読める範囲で。