2010-11-01
Ruby Stringクラスを Cocoa NSStringクラスで実装したMacRuby
個人的にMacRubyの最大の利点かと思っているのですが、MacRubyではStringクラスをCocoaのNSStringクラスを利用して実装されています。そのおかげで、以下のようにRuby APIとCocoa APIをシームレスに扱うことができます。
- Ruby APIを使用して文字を連結
$ macruby -e "puts 'abc' + 'def'" abcdef
- Cocoa APIを使用して文字を連結
$ macruby -e "puts 'abc'.stringByAppendingString('def')"
abcdef
- Ruby, Cocoa APIを一緒に使用することもできます
$ macruby -e "puts 'abc'.stringByAppendingString('def') + '0123'"
abcdef0123
$ macruby -e "puts NSString.alloc.initWithString('abc') + '0123'"
abc0123
Rubyの正規表現や、nokogiriなどのライブラリを利用して文字列処理したあとで、Cocoa APIに文字列を直接渡しちゃうことだってできます!
RubyCocoaは、StringクラスとNSStringクラスは別物として実装されているため、
$ ruby -r 'osx/cocoa' -e "puts 'abc'.stringByAppendingString('def')"
-e:1: undefined method `stringByAppendingString' for "abc":String (NoMethodError)
と怒られちゃいます。
RubyCocoaで同じようなことを行うには、String#to_nsを使用してNSStringに変換する作業が必要になります。
$ ruby -r 'osx/cocoa' -e "puts 'abc'.to_ns.stringByAppendingString('def'.to_ns)"
abcdef
MacRubyでは他にもCocoaのクラスを利用して実装されているRubyのクラスがあります。
| Rubyクラス | Cocoaクラス |
|---|---|
| String | NSString |
| Array | NSArray |
| Hash | NSDictionary |
トラックバック - http://d.hatena.ne.jp/Watson/20101101/1288540994
