初級RubyCocoa〜四 [MacOSX]
RubyCocoa入門的なドキュメントの4回目です。Xcodeに付いてくるドキュメントを解説しています。
GUIがらみの一番使う部分を見ていきましょう。
CocoaReplにソースを書いても当然GUIが見えないので、ここからはXcodeでやってみましょう。
http://limechat.net/rubycocoa/tutorial/
一通りの操作がここを読めばできてしまいそうですが、二度手間でも試行錯誤でやってみたいと思います。
Xcodeのメニューの「ファイル>新規プロジェクト」を選択して、ApplicationでCocoa-Ruby Applicationで作成します。雛形ができるので、それに加えていきます。
そのままビルドして実行すると、何もないウィンドウが開きます。一応、雛形とはいえ一貫したアプリケーションになっています。雛形のソースの内容を見ていくと、main.mがあって、rb_main.rbファイルを蹴っています。蹴られたrbファイルの中身を見ていきます。
当然かもしれないですが、ブレークポイントがはれません。基本gdbだと思うので、Rubyスクリプトのデバッグはできません。変数の内容が知りたければ、pメソッドでっていうことになるんでしょうかね。前回のirbとかCocoaRepl.appとかだと、きちんとコンソール出力が見られたのですが、Xcodeの場合、どうなんでしょ。
内容を見ていくと、rb_initっていうメソッドが呼ばれて始まってます。順に見ると、
app内のリソースパスを調べて、*.rbなファイルを見つけて、requireで読み込み可能
としています。
メソッドの2行目は、パスを見つけていますが、
・NSBundle.mainBundleでアプリケーションがどこで実行されているかを得ます。appのパスをNSBundleクラスとして返します。
・返されたオブジェクトで、NSBundle resourcePathをすると、リソースが含まれるバンドル内のパスが、NSStringで返されます。
・さらに返されたパスで、NSString fileSystemRepresentationで、システム特有な表現で、C言語の文字列が返ります。
最後のfileSystemRepresentationが必要なんだかよく分かりませんが、雛形なので手を入れません。あしからず。
メソッドの3行目は、Rubyのファイルパスを見つけています。
Rubyのスクリプトは特にコンパイルをされず、リソースファイルとしてそのままテキストファイルとして格納されています。それはFinderから.appを右クリックしてパッケージの中身を表示すると、特にコンパイルもされずにそのまま入っているのが確認できると思います。
Dir#entries(path)で、pathにあるファイルを列挙した配列を返しています。
その配列からEnumerable#selectで、*.rbのファイルを選択します。/\.rb\z/では、\.でドット、\zで文字列末尾、rbはそのまま。だから、/\.rb\z/ =~ xに該当する、xはコンソールで使う*.rbという書き方と同様の選択の仕方となる。何も読まずに正規表現はなかなか辛いので、リファレンスを突き合わせながら読むと習得も早いと思います。覚えておくといくらか他の言語とかで潰しがきくかもしれません(ちょっとずつ違うっぽいけど)。
メソッドの4行目は、検索された*.rbなファイルの配列から、rb_main.rbを除いています。引き算するだけで取り除けるってのもお手軽でいいですね。とても分かりやすい。ちなみに__FILE__ってのは、実行しているファイルそのものを表します。C言語ではおなじみのものなので、Rubyでもそれに習って使われているみたいです。C言語を知らない人にとっては変な書き方だと思うかもしれません。
メソッドの5行目以降は、選ばれたファイルを一つずつ処理します。
require()はrbファイルをロードして使えるようにします。これでスクリプトが実行可能になるわけです。
rb_main_initは以上のようになっていて、これが実行されアプリケーションの動作となるわけです。RubyのMakefileに当たるRakefileもありますが、これはとりあえず長めなので今回はスルーとさせていただきます。
元ネタに書いてある実装部分を付け加えていくのは次回にします。
GUIがらみの一番使う部分を見ていきましょう。
CocoaReplにソースを書いても当然GUIが見えないので、ここからはXcodeでやってみましょう。
http://limechat.net/rubycocoa/tutorial/
一通りの操作がここを読めばできてしまいそうですが、二度手間でも試行錯誤でやってみたいと思います。
Xcodeのメニューの「ファイル>新規プロジェクト」を選択して、ApplicationでCocoa-Ruby Applicationで作成します。雛形ができるので、それに加えていきます。
そのままビルドして実行すると、何もないウィンドウが開きます。一応、雛形とはいえ一貫したアプリケーションになっています。雛形のソースの内容を見ていくと、main.mがあって、rb_main.rbファイルを蹴っています。蹴られたrbファイルの中身を見ていきます。
require 'osx/cocoa' def rb_main_init path = OSX::NSBundle.mainBundle.resourcePath.fileSystemRepresentation rbfiles = Dir.entries(path).select {|x| /\.rb\z/ =~ x} rbfiles -= [ File.basename(__FILE__) ] rbfiles.each do |path| require( File.basename(path) ) end end if $0 == __FILE__ then rb_main_init OSX.NSApplicationMain(0, nil) end
当然かもしれないですが、ブレークポイントがはれません。基本gdbだと思うので、Rubyスクリプトのデバッグはできません。変数の内容が知りたければ、pメソッドでっていうことになるんでしょうかね。前回のirbとかCocoaRepl.appとかだと、きちんとコンソール出力が見られたのですが、Xcodeの場合、どうなんでしょ。
内容を見ていくと、rb_initっていうメソッドが呼ばれて始まってます。順に見ると、
app内のリソースパスを調べて、*.rbなファイルを見つけて、requireで読み込み可能
としています。
メソッドの2行目は、パスを見つけていますが、
・NSBundle.mainBundleでアプリケーションがどこで実行されているかを得ます。appのパスをNSBundleクラスとして返します。
・返されたオブジェクトで、NSBundle resourcePathをすると、リソースが含まれるバンドル内のパスが、NSStringで返されます。
・さらに返されたパスで、NSString fileSystemRepresentationで、システム特有な表現で、C言語の文字列が返ります。
最後のfileSystemRepresentationが必要なんだかよく分かりませんが、雛形なので手を入れません。あしからず。
メソッドの3行目は、Rubyのファイルパスを見つけています。
Rubyのスクリプトは特にコンパイルをされず、リソースファイルとしてそのままテキストファイルとして格納されています。それはFinderから.appを右クリックしてパッケージの中身を表示すると、特にコンパイルもされずにそのまま入っているのが確認できると思います。
Dir#entries(path)で、pathにあるファイルを列挙した配列を返しています。
その配列からEnumerable#selectで、*.rbのファイルを選択します。/\.rb\z/では、\.でドット、\zで文字列末尾、rbはそのまま。だから、/\.rb\z/ =~ xに該当する、xはコンソールで使う*.rbという書き方と同様の選択の仕方となる。何も読まずに正規表現はなかなか辛いので、リファレンスを突き合わせながら読むと習得も早いと思います。覚えておくといくらか他の言語とかで潰しがきくかもしれません(ちょっとずつ違うっぽいけど)。
メソッドの4行目は、検索された*.rbなファイルの配列から、rb_main.rbを除いています。引き算するだけで取り除けるってのもお手軽でいいですね。とても分かりやすい。ちなみに__FILE__ってのは、実行しているファイルそのものを表します。C言語ではおなじみのものなので、Rubyでもそれに習って使われているみたいです。C言語を知らない人にとっては変な書き方だと思うかもしれません。
メソッドの5行目以降は、選ばれたファイルを一つずつ処理します。
require()はrbファイルをロードして使えるようにします。これでスクリプトが実行可能になるわけです。
rb_main_initは以上のようになっていて、これが実行されアプリケーションの動作となるわけです。RubyのMakefileに当たるRakefileもありますが、これはとりあえず長めなので今回はスルーとさせていただきます。
元ネタに書いてある実装部分を付け加えていくのは次回にします。
タグ:Ruby
コメント 0