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してやれば見ためそんなに変わらないので、そこは然程違和感はないね。
長いので分割して書くことにしよう。次に続く。