From: Koji Arai Date: 1999-06-30T05:44:12+09:00 Subject: [ruby-dev:7258] TkVariable 新井です。 あまり(全く?)、使われない機能だとは思うんですが、 Ruby/TkのTkVariableの仕様がなんだかおかしいです。 require "tk.rb" $no = 0 def t begin $no += 1 puts "### TEST #{$no} ###" yield rescue puts $! end end # TEST 1 t { v = TkVariable.new p v.value = 1 # => "1" p v.value # => "1" } # TEST 2 t { v = TkVariable.new p v.value = "1" # => "1" p v.value # => "1" } # TEST 3 t { v = TkVariable.new p v.value = [1,2] # => "1 2" p v.value # => "1 2" p v.value = [[1,2]] # => "{1 2}" p v.value # => "{1 2}" } # TEST 4 # これは、 "0 1 1 2" になった方がよい? t { v = TkVariable.new p v.value = {1=>2} # => "-1 2" p v.value # => "-1 2" } # TEST 5 t { v = TkVariable.new([]) p v.value # => {} p v[0] = 1 # => "1" p v.value # => {"0"=>"1"} p v[1] = [1,2] # wrong # args: should be "set varName ?newValue?" p v.value # } # TEST 6 # これは、{"0"=>"1","1"=>"2"} かなぁ? t { v = TkVariable.new([]) p v.value = [1,2] # error! p v.value # } # undefined iterator `collect' for 1 # TEST 7 t { v = TkVariable.new([]) p v.value = {1=>2} # => "" p v.value # => {"1"=>"2"} p v[1] # => "2" p v.value = {1=>[2,3]}# => "" p v.value # => {"1"=>"2 3"} p v.value = {1=>[2,[3]]}# => "" p v.value # => {"1"=>"2 {3}"} } # TEST 8 t { v = TkVariable.new([]) p v.value = [[1],[2]] # => "" p v.value # => {"0"=>"1", "1"=>"2"} } # TEST 9 # {"0"=>"0 1", "1"=>"2 3 4 5"} t { v = TkVariable.new([]) p v.value = [[0, 1],[2, 3, 4, 5]] # => "" p v.value # => {"0"=>"0", "1"=>"1", "2"=>"3", "4"=>"5"} } 望ましい結果をまとめて、パッチを流そうとがんばった んですが、ここで力尽きました。思い切って機能削減し ても良いのかも知れませんねぇ。 あと、あきらかにバグだろうと思える部分のパッチを添 付します。 --- ext/tk/lib/tk.rb.org Fri Jun 25 01:33:28 1999 +++ ext/tk/lib/tk.rb Wed Jun 30 04:23:45 1999 @@ -753,10 +753,9 @@ if INTERP._eval(format('global %s; array exists %s', @id, @id)) != "1" raise else - INTERP._eval(format('global %s; unset %s'), @id, @id) if val == [] - INTERP._eval(format('global %s; set %s(0) 0; unset %s(0)', - @id, @id, @id)) + INTERP._eval(format('global %s; unset %s; set %s(0) 0; unset %s(0)', + @id, @id, @id, @id)) elsif val.kind_of?(Array) a = [] val.each_with_index{|e,i| a.push(i); a.push(array2tk_list(e))} @@ -857,7 +856,7 @@ Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var') else newopts = @trace_opts.dup - opts.each_byte{|c| newopts += c.chr unless @newopts.index(c)} + opts.each_byte{|c| newopts += c.chr unless newopts.index(c)} if newopts != @trace_opts Tk.tk_call('trace', 'vdelete', @id, @trace_opts, 'rb_var') @trace_opts.replace(newopts) @@ -877,7 +876,7 @@ Tk.tk_call('trace', 'variable', @id, @trace_opts, 'rb_var') else newopts = @trace_opts.dup - opts.each_byte{|c| newopts += c.chr unless @newopts.index(c)} + opts.each_byte{|c| newopts += c.chr unless newopts.index(c)} if newopts != @trace_opts Tk.tk_call('trace', 'vdelete', @id, @trace_opts, 'rb_var') @trace_opts.replace(newopts)