Writing method "change!" for String


#1

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.


#2

On 6/5/07, Mike removed_email_address@domain.invalid wrote:

end

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


#3

On 6/5/07, Mike removed_email_address@domain.invalid wrote:

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


#4

On Jun 5, 10:26 pm, Robert K. removed_email_address@domain.invalid wrote:

def change!

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

I missed that method. Thank you.


#5

Mike wrote:

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


#6

On 05.06.2007 14:16, Mike wrote:

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


#7

Hi –

On Tue, 5 Jun 2007, Mike wrote:

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


#8

On 6/5/07, Mike removed_email_address@domain.invalid wrote:

end

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

A Look into Japanese Ruby List in English
http://www.kakueki.com/


#9

Hi,

Am Dienstag, 05. Jun 2007, 21:30:13 +0900 schrieb Robert D.:

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


#10

Hi,

Am Dienstag, 05. Jun 2007, 22:16:33 +0900 schrieb removed_email_address@domain.invalid:

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


#11

Hi –

On Tue, 5 Jun 2007, Harry K. wrote:

    self
 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