On Jun 17, 2006, at 20:48, Bojan Mihelac wrote:

> Do I do something wrong here or I cannot override method upcase in  
> String?
>
> class String
>   def upcase
>     super.upcase
>   end
> end
>
> "abc".upcase

That's not overriding the method, but redefining it.  Overriding  
takes place in subclasses, and you can definitely override the method  
(below).  You'll also note that super doesn't work quite the same way  
as it does in Java - it's not a reference to the superclass, it calls  
the overridden method directly; also, the superclass of String is  
Object, which doesn't have an upcase method, so you would have had  
problems there as well.

class StringLikeThing < String
   def upcase
     super
   end
end

str = StringLikeThing.new("foo")
=> "foo"
str.upcase
=> "FOO"

You can also redefine the method, if that really is what you're after.

class String
   def upcase
     "This used to be the upcase method, now it's gone!"
   end
end
"abc".upcase
=> "This used to be the upcase method, now it's gone!"

If you still want to use the old behaviour, but with some  
modification, you can use an alias:

class String
   alias :real_upcase :upcase
   def upcase
     "upcase: " + real_upcase
   end
end
"abc".upcase
=> "upcase: ABC"

Hope that helps.
matthew smillie