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

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Peña, Botp (Guest)
on 2007-05-31 05:47
(Received via mailing list)
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
Joel VanderWerf (Guest)
on 2007-05-31 05:58
(Received via mailing list)
Peña wrote:
>       x.report(k) { f v }
>         from c:/ruby/lib/ruby/1.8/benchmark.rb:250:in `bmbm'
>    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).
Peña, Botp (Guest)
on 2007-05-31 06:39
(Received via mailing list)
From: Joel VanderWerf [mailto:removed_email_address@domain.invalid] :
# 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
This topic is locked and can not be replied to.