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側からの呼び出しをする、ていうトリックが使われてるところがいっぱいあったのだ。