Frozen string problem, but I haven't frozen anything?

L

LC Geldenhuys

Hi,

I am new to Ruby. I'm trying to get some Ruby scripts going to manage
or CVS log message emails. (I haven't written them myself, got them
from the web.)

I get:
/home/cvs/repository/CVSROOT/commitinfo.rb:26:in `tr_s!': can't modify
frozen string (TypeError)
from /home/cvs/repository/CVSROOT/commitinfo.rb:26

I've done some reading, and I suspect I understand what the frozen
string issue is about. The problem is, I don't see how/why this string
is frozen? Here is the relevant code snippet:

-----------------------------------
if ARGV.size < 4
puts "Usage: #{$0} CVSROOT USER modulepath file1 [file2...]"
exit 1 # No way!
end

$cvsroot, $cvsuser, $modulepath, *$cvsfiles = *ARGV

$cvsroot.tr_s!('/', '/')
$modulepath.tr_s!('/', '/')
-----------------------------------

The two lines using 'tr_s!' causes the problem, but I don't see
how/why $cvsroot or $modulepath is 'frozen'? Might it be due to the
fact that they are passed to the script, i.e. some global/local scope
issue?

Regards,
Lourens
 
E

Emmanuel Touzery

LC said:
Hi,

I am new to Ruby. I'm trying to get some Ruby scripts going to manage
or CVS log message emails. (I haven't written them myself, got them
from the web.)

I get:
/home/cvs/repository/CVSROOT/commitinfo.rb:26:in `tr_s!': can't modify
frozen string (TypeError)
from /home/cvs/repository/CVSROOT/commitinfo.rb:26

I've done some reading, and I suspect I understand what the frozen
string issue is about. The problem is, I don't see how/why this string
is frozen? Here is the relevant code snippet:

-----------------------------------
if ARGV.size < 4
puts "Usage: #{$0} CVSROOT USER modulepath file1 [file2...]"
exit 1 # No way!
end

$cvsroot, $cvsuser, $modulepath, *$cvsfiles = *ARGV

$cvsroot.tr_s!('/', '/')
$modulepath.tr_s!('/', '/')
-----------------------------------

The two lines using 'tr_s!' causes the problem, but I don't see
how/why $cvsroot or $modulepath is 'frozen'? Might it be due to the
fact that they are passed to the script, i.e. some global/local scope
issue?
you can't modify values in ARGV. you have to copy the values.
 
L

LC Geldenhuys

LC said:
Hi,

I am new to Ruby. I'm trying to get some Ruby scripts going to manage
or CVS log message emails. (I haven't written them myself, got them
from the web.)

I get:
/home/cvs/repository/CVSROOT/commitinfo.rb:26:in `tr_s!': can't modify
frozen string (TypeError)
from /home/cvs/repository/CVSROOT/commitinfo.rb:26

I've done some reading, and I suspect I understand what the frozen
string issue is about. The problem is, I don't see how/why this string
is frozen? Here is the relevant code snippet:

-----------------------------------
if ARGV.size < 4
puts "Usage: #{$0} CVSROOT USER modulepath file1 [file2...]"
exit 1 # No way!
end

$cvsroot, $cvsuser, $modulepath, *$cvsfiles = *ARGV

$cvsroot.tr_s!('/', '/')
$modulepath.tr_s!('/', '/')
-----------------------------------

The two lines using 'tr_s!' causes the problem, but I don't see
how/why $cvsroot or $modulepath is 'frozen'? Might it be due to the
fact that they are passed to the script, i.e. some global/local scope
issue?
you can't modify values in ARGV. you have to copy the values.

Thanks, the following now seems to work.

$cvsroot_in, $cvsuser, $modulepath_in, *$cvsfiles = *ARGV

$cvsroot = $cvsroot_in.dup
$modulepath = $modulepath_in.dup

$cvsroot.tr_s!('/', '/')
$modulepath.tr_s!('/', '/')

Cheers,
Lourens
 
R

Robert Klemme

LC Geldenhuys said:
LC said:
Hi,

I am new to Ruby. I'm trying to get some Ruby scripts going to manage
or CVS log message emails. (I haven't written them myself, got them
from the web.)

I get:
/home/cvs/repository/CVSROOT/commitinfo.rb:26:in `tr_s!': can't modify
frozen string (TypeError)
from /home/cvs/repository/CVSROOT/commitinfo.rb:26

I've done some reading, and I suspect I understand what the frozen
string issue is about. The problem is, I don't see how/why this string
is frozen? Here is the relevant code snippet:

-----------------------------------
if ARGV.size < 4
puts "Usage: #{$0} CVSROOT USER modulepath file1 [file2...]"
exit 1 # No way!
end

$cvsroot, $cvsuser, $modulepath, *$cvsfiles = *ARGV

$cvsroot.tr_s!('/', '/')
$modulepath.tr_s!('/', '/')
-----------------------------------

The two lines using 'tr_s!' causes the problem, but I don't see
how/why $cvsroot or $modulepath is 'frozen'? Might it be due to the
fact that they are passed to the script, i.e. some global/local scope
issue?
you can't modify values in ARGV. you have to copy the values.

Thanks, the following now seems to work.

$cvsroot_in, $cvsuser, $modulepath_in, *$cvsfiles = *ARGV

$cvsroot = $cvsroot_in.dup
$modulepath = $modulepath_in.dup

$cvsroot.tr_s!('/', '/')
$modulepath.tr_s!('/', '/')

Why don't you just do

$cvsroot_in, $cvsuser, $modulepath_in, *$cvsfiles = *ARGV

$cvsroot.tr_s('/', '/')
$modulepath.tr_s('/', '/')

? And, why do you use global variables at all?

Regards

robert
 
M

Mark Hubbart

Why don't you just do

$cvsroot_in, $cvsuser, $modulepath_in, *$cvsfiles = *ARGV

$cvsroot.tr_s('/', '/')
$modulepath.tr_s('/', '/')

You probably meant:
$cvsroot = $cvsroot_in.tr_s('/', '/')
$modulepath = $modulepath_in.tr_s('/', '/')

but how about:
$cvsroot, $cvsuser, $modulepath, *$cvsfiles = *ARGV.map{|a|a.dup}

this unfreezes everything automagically.

Cheers,
Mark
 
R

Robert Klemme

Mark Hubbart said:
You probably meant:
$cvsroot = $cvsroot_in.tr_s('/', '/')
$modulepath = $modulepath_in.tr_s('/', '/')

Yes. Thanks for correcting that.
but how about:
$cvsroot, $cvsuser, $modulepath, *$cvsfiles = *ARGV.map{|a|a.dup}

this unfreezes everything automagically.

As always there are tons of ways to do things with Ruby. Which is good.
:)

Regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top