ちょっと GUI なアプリケーションが 作りたくなったので RubyCocoa を 使ってみることにする。
まあ、とりあえず Hello, World。
require 'osx/cocoa'
class HelloApp < OSX::NSObject
def quit(notifier)
exit
end
end
app = OSX::NSApplication.sharedApplication
app.setDelegate HelloApp.alloc.init
win = OSX::NSWindow.alloc.initWithContentRect_styleMask_backing_defer([200.0, 300.0, 250.0, 60.0], 15, 2, 0)
win.setTitle 'Hello RubyCocoa'
win.setLevel(3) # floating window
win.orderFrontRegardless
button = OSX::NSButton.alloc.initWithFrame([10.0, 10.0, 210.0, 40.0])
win.contentView.addSubview button
button.setBezelStyle 4
button.setTitle 'Hello, World!'
button.setTarget app.delegate
button.setAction 'quit:'
button.setEnabled true
app.run
NSWindow の initWith なんたらという メソッド名がやたら長い。 これはなんか理由を聞いたことあるなあ。 RHG 読書会で聞いたんだっけ。 キーワード引数名がエンコードされてるので ハッシュだと順番が変わってしまってだめ、 というやつだな。
(05:12)
長いメソッド名は、とても説明的なので意味をつかみやすいのがメリットだと思うのですが、引数のラベルと実引数をObjective-Cのように対で書けない場合には、むしろ読みにくくてデメリットになってしまいます。ということで、RubyCocoaではobjc_sendというメソッド (0.10.1以降)でそこのところをサポートしています。
http://www.fobj.com/hisa/d/20070209.html#p01
お、その話も以前聞いたような気がします。
もう実装されてたんですね。ありがとうございます。
ついでに、alloc.objc_send(:initXXX, ...) が
new(...) にできたりはしませんか?
ああそうか単純な変換じゃだめなんだ。
「With」がうまくないですね。
なんかいい方法ないのかなあ。
全部 with だったら無条件で
with を付けてしまえばいいのかなあ……。