MacRubyでBaconを調理する準備ができたので、早速Bacon焼くぜー超焼くぜー、と書き始めたんだけど、その前にRubyCocoaとMacRubyの違いを比べてみたくなった。のでちょっと脱線。

# Namake.framework内にあるSloth.h
#import 

@interface Sloth : NSObject {
    NSString *name;
}

- (NSString *)name;
- (void)setName:(NSString *)aName;

@end
$ cat mrb_bacon.rb
# coding: utf-8
require 'bacon'

framework 'build/Release/Namake.framework'

describe Sloth do
  before do
    @obj = Sloth.alloc.init
  end

  it 'Objective-Cのオブジェクトであること' do
    @obj.should.be.kind_of Sloth
    @obj.should.be.kind_of NSObject
  end

  it 'Objective-Cのメソッドを呼べること' do
    @obj.name.should.be.nil
    lambda { @obj.name = "faultier" }.should.not.raise
    @obj.name.should.be.== "faultier"
    @obj.name.should.be.eql "faultier"
    @obj.name.should.be.kind_of String
    @obj.name.should.be.kind_of NSString
    lambda { @obj.setName "ふぁうるてぃあ" }.should.not.raise
    @obj.name.should.be.== "ふぁうるてぃあ"
    @obj.name.should.be.eql "ふぁうるてぃあ"
  end

  it 'Objective-Cのクラスを書き換えられること' do
    lambda { eval 'class Sloth; def name; "nisefaultier"; end; end' }.should.not.raise
    obj = Sloth.alloc.init
    obj.name.should.be.eql "nisefaultier"
    # @obj.name.should.be.eql "nisefaultier"
  end
end
$ macbacon mrb_bacon.rb
Sloth
- Objective-Cのオブジェクトであること
- Objective-Cのメソッドを呼べること
- Objective-Cのクラスを書き換えられること

3 specifications (11 requirements), 0 failures, 0 errors
$ cat rbc_bacon.rb
require 'bacon'
require 'osx/cocoa'
include OSX

bundle = NSBundle.bundleWithPath('build/Release/Namake.framework')
bundle.load

describe Sloth do
  before do
    @obj = Sloth.alloc.init
  end

  it 'Objective-Cのオブジェクトであること' do
    @obj.should.be.kind_of Sloth
    @obj.should.be.kind_of NSObject
  end

  it 'Objective-Cのメソッドを呼べること' do
    @obj.name.should.be.nil
    # lambda { @obj.name = "faultier" }.should.not.raise
    lambda { @obj.name = "faultier".to_ns }.should.not.raise
    @obj.name.to_s.should.be.eql "faultier"
    # @obj.name.should.be.kind_of String
    @obj.name.should.be.kind_of NSString
    lambda { @obj.setName "ふぁうるてぃあ".to_ns }.should.not.raise                     
    # @obj.name.should.be.eql "ふぁうるてぃあ"                                          
    # @obj.name.should.be.eql "ふぁうるてぃあ".to_ns                                    
    # $KCODE = 'u'
    # @obj.name.should.be.eql "ふぁうるてぃあ"
  end

  it 'Objective-Cのクラスを書き換えられること' do
    lambda { eval 'class Sloth; def name; "nisefaultier"; end; end' }.should.not.raise
    obj = Sloth.alloc.init
    obj.name.should.be.eql "nisefaultier"
    @obj.name.should.be.eql "nisefaultier"
  end
end
$ bacon rbc_bacon.rb
OSX::Sloth
- Objective-Cのオブジェクトであること
- Objective-Cのメソッドを呼べること
- Objective-Cのクラスを書き換えられること

3 specifications (12 requirements), 0 failures, 0 errors

上がMacRuby版、下がRubyCocoa版。ぱっと見は思ったより違いはない。まぁgetter/setterしかないクラスなのでアレだけども。RubyCocoaの方はCocoaのクラスはOSXって名前空間の下にあるけど、MacRubyは全てのRubyのクラスがCocoaのクラスのサブクラスって位置付けなので、Cocoaのクラスに特別な名前空間は無い。もともとCocoaのクラスはNSなんとかとかUIなんとかとかそういうprefixが付いてるので、Rubyの組み込みのクラスとバッティングすることはないのでそれでも困らないしね。まぁ、それはRubyCocoaの方でもinclude OSXしてやれば見ためそんなに変わらないので、そこは然程違和感はないね。

長いので分割して書くことにしよう。次に続く。