[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

`concat': can't modify frozen string in benchmark.rb

Peña, Botp

5/31/2007 1:38:00 AM

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

2 Answers

Joel VanderWerf

5/31/2007 1:57:00 AM

0

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

Peña, Botp

5/31/2007 2:30:00 AM

0

From: Joel VanderWerf [mailto:vjoel@path.berkeley.edu] :
# A quick workaround would be to use k.dup:
#
# x.report(k.dup) { f v }

brilliant insight. I never even tested that, thinking k.dup would just be another var/object. And besides, it does not even look *right :)

# 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).

it is really weird.
thank you and kind regards -botp