インターフェースができたので、残るはコーディングです。"CalcCntl.rb" 内に書くコードは下記のとおり。
# CalcCntl
require 'osx/cocoa'
class CalcCntl < OSX::NSObject
ib_outlets :field
def calc (sender = nil) ans = eval input_value = @field.stringValue.to_s @field.setStringValue (input_value + " = " + ans.to_s) end end
さあビルドして‥‥ん、説明しろって? 実はRubyもちょっと前から始めたばかりの初心者なので説明したくないんですよねえ、ぼろが出るから。でもまあ、一応お約束として少々。
# CalcCntl require 'osx/cocoa' class CalcCntl < OSX::NSObject
"require 'osx/cocoa'" は決まり文句として覚えておいてください。次の行は、「これはNSObjectのサブクラスとして作成したCalcCntlクラスだよ」という意味です。
ib_outlets :field
先ほどInterfaceBuilderで作成したoutletは、ここで指定します。フィールドと情報をやり取りする窓口みたいなもんですね。outletを通じてデータをやり取りしたい時は、メソッド内で "@outlet名" と指定します。いわゆるインスタンス変数というやつですか。
def calc (sender = nil) ans = eval input_value = @field.stringValue.to_s @field.setStringValue (input_value + " = " + ans.to_s) end
ここがこのアプリのメインです(たった4行‥)。この4行で"calc"メソッドの振る舞いを定義しています。フィールド内で Enter を押すとここが実行されるわけ
3行目は右から読んでゆくとわかりやすいかな。フィールド内に入ったものを stringValue として取り出し、そいつを式として評価(eval)した結果を "ans" に代入します。Rubyはこうやって代入文を続けて書けるんです。なかなか気の効くやつですね。
次の行では、計算結果を整えてからフィールドに文字列を戻しています。Rubyを知らなくても、何となく意味がつかめるでしょ。"ans" には数値が入っているので、"to_s" を付けて文字列化しています。
これでビルド(ProjectBuilder内のトンカチアイコンをクリック)すれば完成です。出来上がった "calc.app" というファイルをダブルクリックして動けばオッケー。
参考までにプロジェクトファイルごと固めたモノを置いておきます。途中で作成されるアプリ名を変更しようとして色々やっていたら少し変になっちゃったやつですが、まあ大勢に影響はありません。あちこちに配るようなアプリを作る場合は about 情報やアイコン、ファイル情報等の設定をきちんとしなければなりませんが、そこらへんは自由課題とします(←やり方を知らないとみた)
ここで公開したアプリケーションはエラー処理を全くしていないため、数式として成り立たないような文字列を入れると簡単に落ちます。実用性よりも、何人かでもいいから、RubyCocoaの面白さを知るきっかけとなってくれれば嬉しいです。