From: TANAKA Shin-ichi Date: 1997-09-23T02:02:27+09:00 Subject: [ruby-list:4519] どこかがおかしい? 東芝の田中です。 使っているrubyは、 ruby - version 1.0-970919 (i586-linux-a.out) ruby - version 1.0-970919 (i386-freebsd2.2.2) です。 先日、石塚さんが紹介されていたBranchTableを使って、簡単なス クリプトを書こうとしていたんですが、不可解な現象に遭遇したの でちょっと見ていただけませんか? test.rb : 田中の作ったプログラム branch_tbl.rb : 石塚さんの紹介されたプログラム 期待している出力は、 > match = ["1"] 1だよ > match = ["2"] 2だよ なんですが、linuxで実行した場合には、最初にmatchにアクセスし たところ(12行目)で「[BUG] Segmentation fault」となってしまい ます。FreeBSDで実行した場合には、 > match = FALSE 1だよ > match = FALSE 2だよ という結果になってしまいます。 class Bar の宣言をコメントアウトしてみます。すると、どちらの 環境でも > match = ["1"] 1だよ > match = ["2"] 2だよ と、期待した結果を得ることができます。 「require」を使わずに、エディタでこの部分にbranch_tbl.rbを埋め込んだり すると、若干状況が変わります。 class Bar があるとき: Linux: 少しもたもたしながらも、出力される結果は合っている FreeBSD: requireを使ったときと同じ class Bar がないとき: 正常に動作する なんだか、とっても冗長な説明になってしまったのですが、多分バグなん じゃないかと思っています。修正・回避可能でしょうか? == test.rb ここから == require "branch_tbl.rb" class Boo def execute(str) Table.execute(str) end # Booのクラス定数として BranchTable を作る Table = BranchTable.new Table.def_rule(/^(1)/) { |match| print("match = #{match.inspect}\t1だよ\n") } Table.def_rule(/^(2)/) { |match| print("match = #{match.inspect}\t2だよ\n") } end # linuxで動いているものでは、これの有無でcoreを吐いたり吐かなかったりする # FreeBSDで動いているものでは、これの有無で結果が変わる class Bar end boo = Boo.new boo.execute("1") boo.execute("2") == ここまで == == branch_tbl.rb ここから == class BranchTable def initialize @__table = [] @__debug = FALSE return super end def def_rule(pat) @__table.push [pat, proc] end def execute(__line) print "debug:", __line, "\n" if @__debug for rule in @__table #オリジナルではempty?でした。 unless (match = __line.scan(rule[0])).nil? return rule[1].call(match) end end end end == ここまで ==