Joel VanderWerf
5/31/2007 1:57:00 AM
Peña wrote:
> Hi All,
>
> C:\family\ruby>cat test.rb
> def f(command_here)
> `#{command_here}`
> end
> a = { "Local copy"=>"copy test.txt test.txt2" }
> require 'benchmark'
> Benchmark.bmbm do |x|
> a.each do |k,v|
> x.report(k) { f v }
> end
> end
>
> C:\family\ruby>ruby test.rb
> c:/ruby/lib/ruby/1.8/benchmark.rb:334:in `concat': can't modify frozen string (T
> ypeError)
> from c:/ruby/lib/ruby/1.8/benchmark.rb:334:in `report'
> from test.rb:12
> from test.rb:11:in `each'
> from test.rb:11
> from c:/ruby/lib/ruby/1.8/benchmark.rb:250:in `bmbm'
> from test.rb:10
> C:\family\ruby>
>
> if i comment out line 334 in benchmark.rb like so,
>
> #label.concat ' '
>
> It works.
> It also works for the ff cases
> x.report(k) { f v }
> x.report() { f v }
> x.report("") { f v }
> x.report("test") { f v }
>
> What is the relevance of line 334 in benchmark.rb?
> If the line is important, how can I fix my program so I can pass a var in x.report?
>
> thank you and kind regards -botp
>
A quick workaround would be to use k.dup:
x.report(k.dup) { f v }
Apparently, benchmark is being bad and munging its inputs (and falling
down when one of them happens to be frozen because it is also a hash key).
--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407