83's

Top > Tags > Ruby

Ruby

タイトル一覧を表示 | 本文を表示

ruby-gtkmozembedインストール覚書… September 15, 2005 02:40

ruby-gtkmozembedを Vine 3.1にインストールしようとしたら、mkmf-gnome2.rbがrequireしているpkg-config.rbがなくて止まった。 工工エエ(´Д`)エエ工工

これ、調べるとRuby/GLibに付属しているはずなんですが、なぜか無い。 てことで、ruby-gtk2-0.13.0.tar.gzを 落してきて、ruby-gtk2-0.13.0/glib/src/lib/pkg-config.rbを/usr/lib/ruby/1.8/にコピーでいけた。

apt-get install ruby-gnome2-develも忘れずに。

APIのリファレンスは英語しかないのか……。とりあえずサンプルを 動かしてみる。

$ ruby moz.rb
moz.rb:4: undefined method `resize' for "Lean & mean browser":String (NoMethodError)

あれ?

w = Gtk::Window.new.title = "Lean & mean browser"

( ゜д゜)…

w = Gtk::Window.new
w.title = "Lean & mean browser"

に変更。

ruby-gtkmozembedのサンプル実行画面

キタ━━━━━━(゜∀゜)━━━━━━ !!!!!

まーいつものように続かない気もするけど、ちょっと遊んでみますわ。

MeCabの辞書作成補助 September 11, 2005 18:19

形態素解析器MeCabの 辞書を自分で作る場合、動詞や形容詞など活用する品詞については 自分で活用を書かなければいけないんですが、 激しく面倒なのでこれを自動化するやつを作ってみた。

( ・∀・)つ[katsuyou.tar.gz]

このプログラムを使うには、別途ローマ字ひらがな変換ライブラリ suikyoと、 茶筌に(多分)付属しているcforms.chaが必要です。 まー基本的にはcforms.chaでなくても、同じフォーマットで、かつ活用形の中に「基本形」が 入っていれば動くはずです。 あとRubyも必須です。

katsuyou.rbは、入力されたMeCabの辞書の中で活用できるものがあるとそれを活用展開します。 だからあらかじめ1つだけ書いておきます。

ちなみにフォーマットはこう。

表層形,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

例を示します。こんな感じで作っておきます。

ワロス,3206,感動詞,*,*,*,*,*,ワロス,ワロス,ワロス
ナウい,3206,形容詞,自立,*,*,形容詞・アウオ段,*,ナウい,ナウイ,ナウイ
あああ,3206,動詞,自立,*,*,一段,*,ageる,アゲル,アゲル

この中で、展開されるのは2行目と3行目です。展開には表層形と活用形の情報は使わないので、 それ以外をしっかり書いておきます(展開に大事なのは活用型と原形・読み・発音です)。

品詞や活用型については、茶筌のgrammar.chaとcforms.chaに定義してある ものを使います。ipadic-ja.pdfが参考になります。これはlocateしたら出てきたんで、 配布元のリンクは知らないです。茶筌のとこにないかな?  というか、MeCabも茶筌と同じ品詞・活用型で良かったのかね……? もし違ったら( ゜д゜)……

1つ目の引数にcforms.chaを、2つ目に展開したい辞書を渡します。

$ ruby katsuyou.rb cforms.cha test.dic
ワロス,3206,感動詞,*,*,*,*,*,ワロス,ワロス,ワロス
ナウかっ,3206,形容詞,自立,*,*,形容詞・アウオ段,連用タ接続,ナウい,ナウカッ,ナウカッ
ナウい,3206,形容詞,自立,*,*,形容詞・アウオ段,基本形,ナウい,ナウイ,ナウイ
ナウかろ,3206,形容詞,自立,*,*,形容詞・アウオ段,未然ウ接続,ナウい,ナウカロ,ナウカロ
ナウし,3206,形容詞,自立,*,*,形容詞・アウオ段,文語基本形,ナウい,ナウシ,ナウシ
ナウけりゃ,3206,形容詞,自立,*,*,形容詞・アウオ段,仮定縮約1,ナウい,ナウケリャ,ナウケリャ
ナウきゃ,3206,形容詞,自立,*,*,形容詞・アウオ段,仮定縮約2,ナウい,ナウキャ,ナウキャ
ナウき,3206,形容詞,自立,*,*,形容詞・アウオ段,体言接続,ナウい,ナウキ,ナウキ
ナウぅ,3206,形容詞,自立,*,*,形容詞・アウオ段,連用ゴザイ接続,ナウい,ナウゥ,ナウー
ナウ,3206,形容詞,自立,*,*,形容詞・アウオ段,ガル接続,ナウい,ナウ,ナウ
ナウかれ,3206,形容詞,自立,*,*,形容詞・アウオ段,命令e,ナウい,ナウカレ,ナウカレ
ナウから,3206,形容詞,自立,*,*,形容詞・アウオ段,未然ヌ接続,ナウい,ナウカラ,ナウカラ
ナウくっ,3206,形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,ナウい,ナウクッ,ナウクッ
ナウけれ,3206,形容詞,自立,*,*,形容詞・アウオ段,仮定形,ナウい,ナウケレ,ナウケレ
ageろ,3206,動詞,自立,*,*,一段,命令ro,ageる,アゲロ,アゲロ
age,3206,動詞,自立,*,*,一段,連用形,ageる,アゲ,アゲ
ageる,3206,動詞,自立,*,*,一段,基本形,ageる,アゲル,アゲル
ageよ,3206,動詞,自立,*,*,一段,未然ウ接続,ageる,アゲヨ,アゲヨ
ageりゃ,3206,動詞,自立,*,*,一段,仮定縮約1,ageる,アゲリャ,アゲリャ
ageん,3206,動詞,自立,*,*,一段,体言接続特殊,ageる,アゲン,アゲン
ageよ,3206,動詞,自立,*,*,一段,命令yo,ageる,アゲヨ,アゲヨ
age,3206,動詞,自立,*,*,一段,未然形,ageる,アゲ,アゲ
ageれ,3206,動詞,自立,*,*,一段,仮定形,ageる,アゲレ,アゲレ

原形の語尾がカタカナの場合はカタカナで活用するようにしたんだけど、どうなんだろ。

ライブラリとして使う場合は、dic-entry.rb内のDicEntryクラスと、katsuyou.rbのKatsuyouクラスの コンストラクタ、katsuyouメソッドの使い方を見ておくと使えると思います。

ChangeLog

2005-09-18

katsuyou.rbに2ちゃんねる辞書を作るためのコードが混じり込んでて、(no such file 'convert_table'みたいな) エラーになってました。修正しますた。

S式→Array, Array→S式 September 10, 2005 18:24

茶筌まわりの設定ファイルがことごとくS式だかなんだかっていうLispな書式なので、 プログラムからどうにもいじりにくい。てことで、S式とRubyの配列を変換するモジュールを作ってみた。 まーもっといいのが探せばありそうだけど、プログラミングしたかっただけだから再発明も気にしない。 (「S式」で名前はあってる?)

( ・∀・)つ[s-expression.rb]

()を[]に変えるだけなんでしょぼしょぼです。

まー例えば茶筌の活用形定義ファイルcforms.chaの初めの2つを抜き出した以下のようなa.chaファイルが あったとすると、

(カ変・クル
    (   ; (語幹          *       *     )
     (基本形        くる    クル  )
     (未然形        こ      コ    )
     (未然ウ接続    こよ    コヨ  )
     (連用形        き      キ    )
     (仮定形        くれ    クレ  )
     (命令yo      こよ    コヨ  )
     (命令i        こい    コイ  )
     (仮定縮約1    くりゃ  クリャ)
     (体言接続特殊  くん    クン  )
     (体言接続特殊2  く    ク    ))    ; for Dtag <5 October 1999>
)

(カ変・来ル
    (   ; (語幹          *       *     )
     (基本形        来る    クル  )
     (未然形        来      コ    )
     (未然ウ接続    来よ    コヨ  )
     (連用形        来      キ    )
     (仮定形        来れ    クレ  )
     (命令yo      来よ    コヨ  )
     (命令i        来い    コイ  )
     (仮定縮約1    来りゃ  クリャ)
     (体言接続特殊  来ん    クン  )
     (体言接続特殊2  来    ク    ))    ; for Dtag <5 October 1999>
)

SExpression.loadを使えばArrayにして返します。 ちなみに日本語が入ってる場合は文字コード指定しないと動きません、きっと。

#test1.rb
require 'pp'
require 's-expression'
$KCODE = 'euc'

a = SExpression.load(ARGF.read)
pp a
$ ruby test1.rb a.cha
[["カ変・クル",
  [["基本形", "くる", "クル"],
   ["未然形", "こ", "コ"],
   ["未然ウ接続", "こよ", "コヨ"],
   ["連用形", "き", "キ"],
   ["仮定形", "くれ", "クレ"],
   ["命令yo", "こよ", "コヨ"],
   ["命令i", "こい", "コイ"],
   ["仮定縮約1", "くりゃ", "クリャ"],
   ["体言接続特殊", "くん", "クン"],
   ["体言接続特殊2", "く", "ク"]]],
 ["カ変・来ル",
  [["基本形", "来る", "クル"],
   ["未然形", "来", "コ"],
   ["未然ウ接続", "来よ", "コヨ"],
   ["連用形", "来", "キ"],
   ["仮定形", "来れ", "クレ"],
   ["命令yo", "来よ", "コヨ"],
   ["命令i", "来い", "コイ"],
   ["仮定縮約1", "来りゃ", "クリャ"],
   ["体言接続特殊", "来ん", "クン"],
   ["体言接続特殊2", "来", "ク"]]]]

このように、複数の式を1つの配列にして返します。今のところすべて文字列として格納します。

SExpression.loadfileを使えば直接ファイルを読めます。

a = SExpression.load_file('a.cha') #=>上の出力例と同じ

この配列をS式に戻すには、SExpression.to_seを使います。

#test2.rb
require 'pp'
require 's-expression'
$KCODE = 'euc'

a = SExpression.load(ARGF.read)
puts SExpression.to_se(a)
$ ruby test2.rb a.cha
(カ変・クル
  (
      (基本形 くる クル)
      (未然形 こ コ)
      (未然ウ接続 こよ コヨ)
      (連用形 き キ)
      (仮定形 くれ クレ)
      (命令yo こよ コヨ)
      (命令i こい コイ)
      (仮定縮約1 くりゃ クリャ)
      (体言接続特殊 くん クン)
      (体言接続特殊2 く ク)))
(カ変・来ル
  (
      (基本形 来る クル)
      (未然形 来 コ)
      (未然ウ接続 来よ コヨ)
      (連用形 来 キ)
      (仮定形 来れ クレ)
      (命令yo 来よ コヨ)
      (命令i 来い コイ)
      (仮定縮約1 来りゃ クリャ)
      (体言接続特殊 来ん クン)
      (体言接続特殊2 来 ク)))

SExpression.to_seの第2引数にtrueを渡すと、整形をしないで1行で返します。 なんでこんな機能をつけたんだろう……。

SExpression.to_se(a, true)
$ ruby test2.rb a.cha
(カ変・クル ((基本形 くる クル) (未然形 こ コ) (未然ウ接続 こよ コヨ) (連用形 き キ) (仮定形 くれ クレ) (命令yo こよ コヨ) (命令i こい コイ) (仮定縮約1 くりゃ クリャ) (体言接続特殊 くん クン) (体言接続特殊2 く ク)))(カ変・来ル ((基本形 来る クル) (未然形 来 コ) (未然ウ接続 来よ コヨ) (連用形 来 キ) (仮定形 来れ クレ) (命令yo 来よ コヨ) (命令i 来い コイ) (仮定縮約1 来りゃ クリャ) (体言接続特殊 来ん クン) (体言接続特殊2 来 ク)))

このモジュールを茶筌の設定ファイル以外で用いる場合の注意点は、 SExpression.load, SExpression.load_fileの入力は 1つ以上の式を想定していて、出力は各式が1次元に並んだ配列であることです。 SExpression.to_seはその逆です。

SExpression.load('(a b c)') #=> [["a", "b", "c"]]
SExpression.load('(a b c)(1 2 3)') #=> [["a", "b", "c"], ["1", "2", "3"]]
SExpression.to_se([["a", "b", "c"]], true) #=> "(a b c)"
SExpression.to_se([["a", "b", "c"], [1, 2, 3]], true) #=> "(a b c)(1 2 3)"

まとめると、["a", "b", "c"] <=> (a b c)の変換ではない点に注意です。

処理の必要上SExpression.array_to_se(引数はto_seと同じ)という関数があって、 一応これを使うと["a", "b", "c"] => (a b c)はできます。

SExpression.array_to_se(["a", "b", "c"], true) #=> "(a b c)"

バグはきっとあるはずw

texのレイアウト・スタイル情報を変えるスクリプト作った September 06, 2005 03:03

普段からrdtool+rd2latexのお世話になっているんですが、 rd2latexはレイアウト情報を全く入れないので、デフォルトのスカスカしたのができあがります。

rd2latexで作ったpdfの画像

そこで、rd2latexが吐いたtexを編集してスタイルを追加していくやつが欲しいなぁと。 でもrdのためのただの使い捨てのプログラム作るのもなんか面白くなかったんで、 のちのち拡張できるような汎用性の高めなものを作ってみた。 しょうもないもんですが、アウトプットします。

( ・∀・)つ[texpref 0.1]

なんか複雑すぎて自分でも使い方わからないんで、一応説明書。。。

  • texファイルのスタイルを変更する
  • コマンドラインにオプションを指定してスタイルを変更できる(指定できるオプションは--helpで見れます)
  • ファイルに保存しておいたスタイルを適用できる
  • ファイルとオプションを同時に使える(ファイルの設定をオプションが上書きします)
  • 変更したtexデータは標準出力に吐く
  • プログラムに読み込んだスタイルを設定ファイルとして保存できる

texファイルを読み込むには-iを使います。これだけだと何にもスタイルは変更されません。

$ ruby texpref.rb -i a.tex
\documentclass{jarticle}
\begin{document}
\end{document}

-iの後にファイル名を指定しない場合、標準入力から読みます。

$ rd2 -r rd/rd2latex-lib a.rd | ruby texpref.rb -i

--で始まるオプションでスタイルを変更できます。

$ ruby texpref.rb -i a.tex --fontsize=11pt
\documentclass[11pt]{jarticle}
\begin{document}
\end{document}

圧縮ファイルに、pref.yamlという名前の設定ファイルを添付しておきました。 設定ファイルを使ってスタイルを変更するには-lで指定します。

$ ruby texpref.rb -i a.tex -l pref.yaml
\documentclass[10pt,a4paper,onecolumn]{jarticle}
\setlength{\\textwidth}{47zw}
\setlength{\\oddsidemargin}{0pt}
\setlength{\\textheight}{43\\baselineskip}
\setlength{\\evensidemargin}{0pt}
\setlength{\\topmargin}{-0.3in}
\begin{document}
\end{document}

-lのあとのファイル名を省略すると、~/.texpref.yamlを読み込みます。 使い回すスタイルはこのファイルにしておくといいです。

設定ファイルとオプションは、同時に使えます。かぶった場合、オプションのほうが優先されます。

$ ruby texpref.rb -i a.tex -l --fontsize=12pt --paper=b5paper
\documentclass[12pt,b5paper,onecolumn]{jarticle}
\setlength{\\textwidth}{47zw}
\setlength{\\oddsidemargin}{0pt}
\setlength{\\evensidemargin}{0pt}
\setlength{\\textheight}{43\\baselineskip}
\setlength{\\topmargin}{-0.3in}
\begin{document}
\end{document}

このようにしてプログラムに読み込んだ設定は、ファイルに書き出して次回以降利用できます。 書き出すファイル名は-sオプションで指定します。ちなみに形式はyamlです。 次の例では、texファイルを読み込まずに、設定ファイルとオプションから読み込んだ スタイルを保存してます。もちろん上の例に-sを使うこともできます。

$ ruby texpref.rb -l --fontsize=12pt --paper=b5paper -s pref2.yaml
$ cat pref2.yaml
---
SetlengthStyle:
  "\\topmargin": "-0.3in"
  "\\evensidemargin": 0pt
  "\\textheight": 43\baselineskip
  "\\oddsidemargin": 0pt
  "\\textwidth": 47zw
DocumentclassStyle:
  column: onecolumn
  paper: b5paper
  fontsize: 12pt
  doc_class: jarticle

ちなみにyamlをいじるのはいいけど、この項目以外を追加しても適用されないんで。

rd2latexでは脚注が{\footnote はときいん}に変換されるが、 どうやら正しくは\footnote{はときいん}のようなので この修正をする機能もつけときました。

あとはrd→pdfのシェルスクリプトに追加してやれば、 オレの生活はいくらか幸せになります。

nkf -e $1 | rd2 -r rd/rd2latex-lib | texpref.rb -i -l > $texfile

こんだけのことをするのにソースがかなり膨らんでる分、 あとは変更するパラメータをどんどんプログラムに追加していけばいい状態にはなった感じ。 「これ設定できるようにしてよ」ってのあれば言って下さい。作ってくれてもいいですが。

でも結局texがわからないと(オレもわかってませんが)スタイルを指定できないのが痛いところ。 編集はこれでいけるから、あとは設定ファイルを作るGUIがあればよさげ。 wxRuby試そうかなーと思う。やる気があれば……。

My Favorite RUBY Modulesはないすか? August 24, 2005 02:07

PerlにはMy Favorite Perl Modulesっていうナイスな サイトがあって、ここではCPANに上がってるモジュールについてみんなのお気に入りとかおすすめとか が見れて、いわゆる定番モジュールを知ることができるんじゃないかなと思う。 Rubyにもこういう定番モジュールとかわかる情報源ないですかねぇ? ビギナーなんで 全然モジュール知らないんすよねー。

連番ファイルの桁そろえ July 26, 2005 02:52

そむろーいがkatamayuサーバとExciteの二重生活開始らしい。 いっそ移転しちゃえばいいんじゃないですかね?

じゃーとりあえずトラックバックテストってことで、コメントじゃなくこっちに。

連番のファイルの数字の桁(というか幅?)をそろえたい という話だが、なんだかまどろっこしいスクリプト書いてるね。 こんなんでどうすか。

#rename.rb

width = ARGV.shift.to_i
files = ARGV

files.each{ |f|
  File.rename(f, f.sub(/\d+/){sprintf("%0#{width}d", $&.to_i)})
}
$ ls
hoge1.txt  hoge11.txt  hoge2.txt
$ ruby rename.rb 2 hoge*
$ ls
hoge01.txt  hoge02.txt  hoge11.txt
$ ruby rename.rb 3 hoge*
$ ls
hoge001.txt  hoge002.txt  hoge011.txt

エラー処理してないけど、使い捨てならこんなもんでいいかと。 これだと連番の前に他の数字があったりする(83s_entry_01.txtとか)とおかしくなるから、 そのときはsubの正規表現いじればよさげ。

デバッグ用メソッドはどうするか July 07, 2005 16:29

Rubyに限った問題ではないけど、デバッグにだけ必要な(インスタンス|クラス)メソッドってのを 作らなきゃならないときってないすか? ほかには、デバッグのときだけprivateをpublicにしたいとか。 で、このデバッグ用メソッドが本来必要なメソッドと一緒の場所に 書かれてるのは気持ち悪いっていうか、いつ消そう?ってなるよな? Rubyで(゜д゜)ウマーな方法を思いついた。

class Example

  省略

  private

  def private_method
  end
end

というクラスに対して、デバッグ用のメソッドdebug_methodを定義したい。 また、private_methodをpublicにしたい。このとき、テスト用のコードのところで

#テスト用コード

class Example
  def debug_method
  end

  public :private_method
end

ex = Example.new
ex.debug_method
ex.private_method

とやって、デバッグのときだけExampleクラスにdebug_methodメソッドを追加し、 private_methodをpublicにする。なんて強力なんだRuby。

Javaだったらどうなるんだろ。 privateをpublicに変更するってのは、privateのと中身の同じメソッドをpublicで追加できれば同じことだから、 メソッドの追加さえできれば上と同じことが実現できるわけだが。

でもクラスの定義を継承以外で追加・オーバーライドってのはなかった気がするし、 継承してもスーパークラスのprivateなフィールドにはアクセスできないから、privateなフィールドの デバッグプリントをするようなメソッドは定義できない……。 なんかうまいテスト方法があるんだろうな。教えてエロイ人。

Rubyの簡単なテストドライバの書き方 July 07, 2005 15:26

簡単な単体テストならテスト用のファイルを作ってテストするのもめんどくさいから、 そのファイルに書いてしまうと楽。これは確かRubyを256倍使うための本 網道編 を見てたときに出てきた方法。

# example.rb

class Example

省略

end

if $0 == __FILE__

テストドライバ

end

$0は現在実行しているファイル名、__FILE__はここでは"example.rb"になる。 だから、$ ruby example.rbとして実行している時にしか、例にあるテストドライバは実行されない。 Javaでいう、public static void mainと同じ扱いかな。 これによって、ファイル数を増やさないでテストドライバを残しておける。ま、 それがいいのか悪いのかはまた別……。

テストドライバを残すだけなら$0 == __FILE__ 〜 endはいらないじゃないかと 思うかもしれないが、こう書いておかないとrequireされた場合にも実行されてしまう。

テストドライバではなく、プログラムの実行部分としてクラスの定義と同じファイルに 書いた場合も、もしそのクラスが他のファイルから使われる可能性のある(つまり汎用性のある)もののようなら、 if $0 == __FILE__ 〜 endに書いておくと、requireされたときに 余計なバグの原因にならなくてすむんじゃないかな。

文字コードの変換 June 08, 2005 02:57

Rubyで文字コードの変換(EUC→UTF-8、UTF-8→EUC)をするのに簡単な ものはないかと調べてみたらこんな感じ。

このうち、NKFとKconvはUTF-8関連のメソッドを呼ぶと、うちの環境(Vine 3.1)ではNoMethodErrorが 投げられて使えない。 なんだろうな、UTF-8のメソッドはruby 1.8.2から対応しているみたいな書き方が リファレンスページではされてるんだけど、それが使えないということは どうもVineのRubyのバージョンのせいかなぁ……。 というのは、rpm -q rubyをやるとruby-1.8.1-0vl20って出てくるからそう思うんだが。

てことでuconv決定。A code conversion library for UCS-4, UTF-16, UTF-8,EUC-JP and CP932. ということなのでShift-JISは無理か。そっちはnkfかねぇ。

こういうどのプログラムを書くにしても必要になってきそうなモジュールというのが わかってくると、プログラミングもしやすくなってくるような感じ。

にしてもuconvはpure Rubyではないんで、 Perlでいうjcode.pmのようにソースと一緒に配布ってわけにも行かん。

メソッド自動生成 April 23, 2005 01:11

昨日との繋がりでRDtool のvisitor.rbのソースを見てたんだが、 そのなかにこんなのがあってRuby初心者の俺は戸惑ったわけね。

class Visitor
     ・
     ・
     ・
    def Visitor.define_visit_Nonterminal(element_type)
      eval <<-END_OF_EVAL
      def visit_#{element_type.id2name}(element)
        apply_to_#{element_type.id2name}(element, visit_children(element))
      end
      END_OF_EVAL
    end

    def Visitor.define_visit_Terminal(element_type)
      eval <<-END_OF_EVAL
      def visit_#{element_type.id2name}(element)
        apply_to_#{element_type.id2name}(element)
      end
      END_OF_EVAL
    end

    define_visit_Terminal(:Include)
    define_visit_Terminal(:Verbatim)
    define_visit_Terminal(:MethodListItemTerm)

    define_visit_Nonterminal(:DocumentElement)
    define_visit_Nonterminal(:Headline)
    define_visit_Nonterminal(:TextBlock)
    define_visit_Nonterminal(:ItemList)
    define_visit_Nonterminal(:EnumList)
    define_visit_Nonterminal(:DescList)
    define_visit_Nonterminal(:MethodList)
    define_visit_Nonterminal(:ItemListItem)
    define_visit_Nonterminal(:EnumListItem)
     ・
     ・
     ・
end

忘れないようにメモっておくんだが、Rubyはclass〜endの中 (でありメソッドや変数初期化の中ではない位置)で クラスメソッドを呼ぶことができるみたいだ (上のソースではdefine_visit_Terminal(:Include)など)。

で、呼ばれるタイミングはそれが書かれているファイルがrequireされた位置だ。 これは以下のような簡単なテストをすればわかる。

#test.rb
#----------
class Test
  @@name = 'noname'

  def initialize(name)
    @@name = name
  end

  def Test.name()
    @@name
  end

  puts '(In Test)' + name()
end


#test2.rb
#----------
require 'test'

puts "kitano"
a = Test.new("shiomi")
puts '(In Main)' + Test.name
$ ruby test2.rb
(In Test)noname
kitano
(In Main)shiomi

見てわかるように、実行しているプログラムは"kitano"を出すことから始まってるのに、 その前にTestクラス内からメソッドが実行されている。

で、初めのプログラムに戻ると、visitor.rbがrequireされたときに define_visit_Terminal(:Include)などが呼ばれ、Visitorクラスのインスタンスメソッドとして visit_Include(element)とかが定義される……ってことになるんじゃないかと。 中身が同じのメソッドを、require時に自動で生成している、ということか。 いや、横着のためにここまでするとは……。

しかし未だにシンボルがよくワカンネ(´・ω・`)