From: Yasunari Momoi Date: 1997-09-18T09:10:27+09:00 Subject: [ruby-list:4384] BranchTable class (2) ももちゃん@あるもにこすです. さて,さっき流した BranchTable class ですが,ちょっと疑問点が あります. ## プログラム(1) require "BranchTable" tbl = BranchTable.new([ '/^bye$/i', '0', '/^put (.*)$/i', 'print $1, "\n"; 1', '/^hoge/i', 'print foo, "\n"; "HOGE"', '/^(.*)$/i', 'print foo, ":", $1, "\n"; 2', ]) foo = 0 while l = STDIN.gets.chop foo = foo + 1 case tbl.execute(l) when 0 break end end これを動かすと, ./BranchTable.rb:13:in `eval': NameError| undefined local variable or method `foo' for #(BranchTable) from ./BranchTable.rb:13:in `execute' from t6.rb:12 と怒られます. この意味は分かるんですが,同じクラスを使った次のプログラム, ## プログラム(2) require "socket" require "BranchTable" tbl = BranchTable.new([ '/^BYE$/i', 'FALSE', '/^(.*)$/i', 's.write("-" + $1 + "\n")', ]) gs = TCPserver.open(9900) addr = gs.addr addr.shift printf("server is on %d\n", addr.join(":")) while TRUE ns = gs.accept print(ns, " is accepted\n") Thread.start do s = ns # save to dynamic variable while l = s.gets case tbl.execute(l.chop!) when FALSE break end s.write("+OK\n") end print(s, " is gone\n") s.close end end こちらは動いてしまいます. プログラム(1)の foo もプログラム(2)の s もローカル変数だと思っ てたんですが,この二つはどう違うのでしょうか? -- Yasunari Momoi , Armonicos Co., Ltd. WIDE: , JLUG: