きりかノート 3冊め

おあそびプログラミング

RubyCocoa 今日のコミット(2007.05.21)

すげえ久しぶりのコミット。多くのケースで Cocoa の文字列に対して to_s が不要に(たぶん)。

Cocoa勉強会 関西で沼田さんに「to_s がいろんなとこで必要なのってどうにかならない?」と言われたのでトライ。たしかに、なぜ to_s が必要なのかを説明するのも大変だし、そこをプログラマが意識しなけりゃいけないのってなんかバカバカしいよな。

最初はパッチだけ投げて意見を聞いてみようと思ったけれど、いきなりコミットしてみた(r1755)。ダメなら revert すりゃいいだけだしね。

  1. to_str を実装。open() などいくつかのメソッドで String として扱われる
  2. NSString と String 間の比較を Ruby の文字列と同じに。rbstr.to_s としなくても比較できる。
  3. String が実装しているメソッドが呼ばれたら、Ruby の文字列として実行。rbstr.gsub() とかできるように。

3.は内部では単純に to_s してそのメソッドを呼び出しているので、破壊的メソッドのときは操作結果を NSString(NSMutableString) に反映してやらなくちゃいけない。でもさ、あるオブジェクトが mutable か immutable かを判定することって Cocoa 的にはできないんだよね。クラスクラスタでは isKindOfClass: は全体について効いてくるから、[NSString isKindOfClass:(Class) NSMutableString] が YES になったりするのだ。

仕方ないので、そのまま setString: して例外が発生するのにまかせることに。immutable であることがわかっていれば、to_s.freeze したオブジェクトにメッセージ送ればよいから、今の実装よりはキレイに書けるのになあ。

ちなみにハッシュのキーとしてはまだ to_s が必要。これをちゃんと実装するには、String#eql? をオーバーライドする必要があり、それは影響が大きすぎるだろう、と思うのだ。NSString#hash、NSString#eql? を定義すれば、ハッシュ内のキーが NSString で検索するキーが String というケース以外は動作するようにはなる。けれど、中途半端だよね。これは。