こんにちは、鄭です。
いまさらながら、Ruby/Tk をやってみようと思ってのっけから引っかかっています。
(ちなみに、Tcl/Tk は基本的な使い方はわかっているつもりです。C言語から
みたインタープリタの内部構造は、ぜんぜん知りませんが。)
まず、何はともあれ Ruby_Tk-widget-demo-1.1.tar.gz を展開して、簡単そうな
ところからみてみようとしたのですが、
hello で
#!/usr/local/bin/ruby
require 'tk'
TkButton.new(nil,
'text'=>"こんにちは、世界",
'command'=>proc{print "こんにちは、世界\n"; exit}
).pack
Tk.mainloop
TkButton.new の引数の ruby 的なシンタックスが了解できません (^_^;;
最初の nil はとりあえずおいておいて、2番目と3番目の XXX => YYY は、{ と }で
囲まれていれば、ハッシュのオブジェクトなんだなとおもうのですが、{ } が
無い場合どう理解すればいいのでしょうか? (質問1)
この hello の TkButton.new(...).pack は、Tcl/Tk 風に書けば
button .b1 -text "こんにちは、世界" -command rubyのprocオブジェクト
pack .b1
をひとつづきに書いたものだと思うのですが、最初の引数 nil はどういう
意味があるのでしょう? (質問2)
どうもいきなり widget demo をみてもわからなそうなので、require 'tk'から
たぐって tk.rb を眺めてみたら
require "tcltklib"
require "tkutil"
があります。で、ruby-1.1cx/ext/{tcltklib,tkutil} を覗いてみる事にしました。
ruby-1.1cx/ext/tkutilは、
TkUtil モジュールを定義してそのメソッドとして eval_cmd を定義しているらしい。
TkKernel クラスを定義してそのメソッドとして new を定義しているらしい。
よくわからないけど、new はイテレータとしても使えるらしい。
C言語レベルの rb_yield_0(obj, obj); は ruby レベルでは
イテレータブロックにどのようなパラメータがわたるのだろう?
(これは理解しておく必要があるのだろうか?)
ruby-1.1cx/ext/tcltklibは、ありがたや、README.euc/MANUAL.euc がある、、、
どれどれ、、、
README.euc:66行目 >>> (`tk.rb' との違い)
え? tk.rb とちがう????
+----------------------------------------------+
| Ruby/Tk アプリケーションスクリプト |
+---------------------------------------+ |
| lib/tk.rb | |
+------------------+--------------------+ |
| ext/tkutil拡張 | ext/tcltklib 拡張 | |
+------------------+--------------------+------+
| ruby インタプリタ本体 |
+----------------------------------------------+
みたいな、階層構造になっていると理解しかけていたのですが、、、ちがうんで
しょうか? (質問3)
それと、ext/tcltklib/lib/tcltk.rb は、lib/tk.rbを使うときは関係ないのでしょう
か? (質問4)
--
┌─鄭 明毅───────────────────┐
└──tei / harmony.co.jp──tei@mirage.linc.or.jp─┘