How to write a destructive string method?

I haven't been able to figure out how to write a destructive string
method of my own. How do I change the value of "self"? This is what I
tried first:

class String
  alias_method(:orig_upcase, :upcase)

  def upcase
    orig_upcase.tr("åäö", "ÅÄÖ")
  end

  def upcase!
    self = self.upcase
  end
end

"upcase" works fine but "upcase!" doesn't - "can't change the value of
self". Nor can I do (assuming another alias_method):

  def upcase!
    self.old_upcase!
    self.tr!("åäö", "ÅÄÖ")
  end

or the same thing chained (self.old_upcase!.tr!(...)), because that only
returns nil. I've even grasped for straws like

  def upcase!
    =(self.upcase)
  end

with no luck. Very grateful for any help.

···

--
Posted via http://www.ruby-forum.com/.

  def upcase!
    self = self.upcase

          replace(upcase)

  end
end

Guy Decoux

Henrik wrote:

I haven't been able to figure out how to write a destructive string method of my own. How do I change the value of "self"?

ri String#replace

I don't know if that'll help, 'cause I don't know why this didn't work:

def upcase!
  self.old_upcase!
  self.tr!("åäö", "ÅÄÖ")
end

Devin

Henrik schrieb:

I haven't been able to figure out how to write a destructive string method of my own. How do I change the value of "self"? This is what I tried first:

it makes no sense to change self, but you can change the data of self:

---- test.rb
class String
   def makefirstA
     self[0]= 65
     self
   end
end

x="xxxx"
p x.makefirstA
p x
--- end of test.rb

delivers

ruby test.rb
"Axxx"

···

class String
  alias_method(:orig_upcase, :upcase)

  def upcase
    orig_upcase.tr("åäö", "ÅÄÖ")
  end

  def upcase!
    self = self.upcase
  end
end

"upcase" works fine but "upcase!" doesn't - "can't change the value of self". Nor can I do (assuming another alias_method):

  def upcase!
    self.old_upcase!
    self.tr!("åäö", "ÅÄÖ")
  end

or the same thing chained (self.old_upcase!.tr!(...)), because that only returns nil. I've even grasped for straws like

  def upcase!
    =(self.upcase)
  end

with no luck. Very grateful for any help.

--
Mit freundlichen Grüßen
Fritz Heinrichmeyer FernUniversität, LG ES, 58084 Hagen (Germany)
tel:+49 2331/987-1166 fax:987-355

Henrik wrote:

Nor can I do (assuming another alias_method):

  def upcase!
    self.old_upcase!
    self.tr!("åäö", "ÅÄÖ")
  end

or the same thing chained (self.old_upcase!.tr!(...)), because that only returns nil.

I'd do it like this: (Ignoring the more obvious replace solution)

class String
   alias :old_upcase! :upcase!
   def upcase!()
     old_upcase!
     tr!("åäö", "ÅÄÖ")
   end

   def upcase()
     result = self.clone
     result.upcase!
     return result
   end
end

···

--
http://flgr.0x42.net/

ts wrote:

> def upcase!
> self = self.upcase

          replace(upcase)

> end
> end

Guy Decoux

Worked fine, thanks! Got some help on #ruby-lang, apparently you can do
stuff like the above and

self[0..-1] = "whatever"
but not
self = "whatever"

seeing as self is an object, not a variable - if anyone else was
wondering.

···

--
Posted via http://www.ruby-forum.com/\.

"self = self.upcase".replace("replace(upcase)")

(Sorry, couldn't resist.)

David

···

On Fri, 6 Jan 2006, ts wrote:

> def upcase!
> self = self.upcase

         replace(upcase)

--
David A. Black
dblack@wobblini.net

"Ruby for Rails", from Manning Publications, coming April 2006!