きりかノート 3冊め

おあそびプログラミング

RubyCocoa 今日のコミット - relaxed_syntax = falseの動作を変更

ひさしぶりのコミット。

もろもろの事情により、RubyCocoaではOSX.relaxed_syntaxというtrue/falseのスイッチがあって、trueのときはrubyからobjecitve-cメソッドを扱うときに末尾の"_"を省略できるようになる(デフォルト)。

# relaxed_syntax = false
  NSURL.URLWithString_('http://...')
                   # ^ needs "_"

# relaxed_syntax = true (default)
  NSURL.URLWithString('http://...')
  NSURL.URLWithString_('http://...')
                   # both syntaxes are available

なんだけど、Objective-Cからruby側のメソッドを呼び出すときはちょっとちがう。

# relaxed_syntax = false
  [rbobj foo:arg]  # call rbobj#foo_

# relaxed_syntax = true (default)
  [rbobj foo:arg]  # call rbobj#foo

というように、固定された形式の呼び出ししかできない。これの問題は、relaxed_syntax = falseで動くように書いたプログラムがrelaxed_syntax = trueでは動作しないことがあるということだ。relaxed_syntax = falseは安全側にしたコードであるにもかかわらず、動作しないことがあるってのは本末転倒だ。(rubycocoa MLでのレポートで発覚、ありがとう!)

ということで、

# relaxed_syntax = false
  [rbobj foo:arg]  # call rbobj#foo_

# relaxed_syntax = true (default)
  [rbobj foo:arg]  # call rbobj#foo_ or rbobj#foo, prefer former

というように、relaxed_syntax = trueのときにも"_"つきのメソッドを優先して呼び出すよう動作を変更したのが今回の変更。

これ自体の修正はあんまし大変じゃなかったのだけど、テストのほうが影響大。うしろに"_"をつけた名前でrubyから呼ぶことでobjective-c側からの呼び出しをする、ていうトリックが使われてるところがいっぱいあったのだ。