ちょっと 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)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
長いメソッド名は、とても説明的なので意味をつかみやすいのがメリットだと思うのですが、引数のラベルと実引数を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 を付けてしまえばいいのかなあ……。