Writing method "change!" for String

M

Mike

Hi,

I'm trying to write simple method to change internal value of
String class:

class String
def change!
self="0" if self.downcase=="myvalue1"
self="1" if self.downcase=="myvalue2"
self
end
end

test="myvalue1"
test.change!
p test

It should just change value of string to what I want. But I get error:
"Can't change the value of self".
How do I proceed?

Thanks.
 
R

Robert Klemme

Hi,

I'm trying to write simple method to change internal value of
String class:

class String
def change!
self="0" if self.downcase=="myvalue1"
self="1" if self.downcase=="myvalue2"
self
end
end

test="myvalue1"
test.change!
p test

It should just change value of string to what I want. But I get error:
"Can't change the value of self".
How do I proceed?

You don't. Just use String#replace.

Btw, what are you trying to achieve?

Kind regards

robert
 
J

Jano Svitok

Hi,

I'm trying to write simple method to change internal value of
String class:

class String
def change!
self="0" if self.downcase=="myvalue1"
self="1" if self.downcase=="myvalue2"
self
end
end

test="myvalue1"
test.change!
p test

It should just change value of string to what I want. But I get error:
"Can't change the value of self".
How do I proceed?

Thanks.

use String#replace instead of assignment. Beware of the implications!
(i.e. you are changing the string the variable points to!) for
example:

...

test = "myvalue1"
foo = test
bar = test

test.change!

p foo #=> "0"
p bar #-=> "0"

If you don't want this behaviour return new value instead of replace
and do an assigment to variable:

test = test.change
 
R

Robert Dober

Hi,

I'm trying to write simple method to change internal value of
String class:

class String
def change!
self="0" if self.downcase=="myvalue1"
self="1" if self.downcase=="myvalue2"
self
end
end
class String
def change!
case downcase
when "myvalue"
replace("0")
etc. etc.
test="myvalue1"
test.change!
p test

It should just change value of string to what I want. But I get error:
"Can't change the value of self".
How do I proceed?

HTH
Robert
 
D

Devin Mullins

Mike said:
It should just change value of string to what I want. But I get error:
"Can't change the value of self".

You really can't. Consider:
class Fixnum
def double!
self *= 2
end
end
3.double! # wha happen?
How do I proceed?
ri String#replace
 
H

Harry Kakueki

Hi,

I'm trying to write simple method to change internal value of
String class:

class String
def change!
self="0" if self.downcase=="myvalue1"
self="1" if self.downcase=="myvalue2"
self
end
end

test="myvalue1"
test.change!
p test

It should just change value of string to what I want. But I get error:
"Can't change the value of self".
How do I proceed?

Thanks.
Do not try to change self.

Try this.

class String
def change!
val="0" if self.downcase=="myvalue1"
val="1" if self.downcase=="myvalue2"
val
end
end

test="myvalue1"
p test.change!
p test

Harry
 
D

dblack

Hi --

Hi,

I'm trying to write simple method to change internal value of
String class:

class String
def change!
self="0" if self.downcase=="myvalue1"
self="1" if self.downcase=="myvalue2"
self
end
end

test="myvalue1"
test.change!
p test

It should just change value of string to what I want. But I get error:
"Can't change the value of self".
How do I proceed?

ri String#replace


David

--
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black)
(See what readers are saying! http://www.rubypal.com/r4rrevs.pdf)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)
 
B

Bertram Scharpf

Hi,

Am Dienstag, 05. Jun 2007, 21:30:13 +0900 schrieb Robert Dober:
class String
def change!
case downcase
when "myvalue"
replace("0")
etc. etc.

alternatively:

class String
def change!
case self
when /myvalue1/i then replace "0"
when /myvalue2/i then replace "1"
etc. etc.


Bertram
 
D

dblack

Hi --

Do not try to change self.

Try this.

class String
def change!
val="0" if self.downcase=="myvalue1"
val="1" if self.downcase=="myvalue2"
val
end
end

test="myvalue1"
p test.change!
p test

I think even the original idea probably wasn't a good !-candidate
(since bang methods generally have non-bang equivalents, whereas
methods with names that imply change or other "danger" [like replace]
don't), and definitely if you're not modifying the string or doing
anything else dangerous, the ! is not a good idea, since it's out of
keeping with the convention.


David

--
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black)
(See what readers are saying! http://www.rubypal.com/r4rrevs.pdf)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)
 
B

Bertram Scharpf

Hi,

Am Dienstag, 05. Jun 2007, 22:16:33 +0900 schrieb (e-mail address removed):
I think even the original idea probably wasn't a good !-candidate
(since bang methods generally have non-bang equivalents, whereas
methods with names that imply change or other "danger" [like replace]
don't),

As far as I see banged methods are mostly implemented as

class String
def modify_it!
...
end
def modify_it
str = dup
str.modify_it!
str
end
end

(Of course some C equivalent.)

So, if Mike means what he does he can easily add the
counterpart.

Bertram
 

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,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top