On Thu, Sep 19, 2002 at 09:20:13PM +0900, Vincent Foley wrote: > I was discussing with a (Python) friend last night. I told him that one > thing I liked better about Ruby than Python was that you could add > methods to already existing methods. For instance, if I wanted to add a > rot13 method to the String class, all I have to do is this: > > [code] > class String > def rot13 > tr("A-Za-z", "N-ZA-Mn-za-m") > end > end > > "foobar".rot13 > [/code] > > But my friend told me that Python didn't have that because it was not a > good thing and it was not the proper way to do it. He said that the > true way of doing it, is to subclass (since Python 2.2 can now subclass > builtin types) the base class: > > [code] > class myStr(str): > def rot13(self): > trans = maketrans( > "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", > "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm") > newstring = translate(word, trans) > return newstring > > myStr("foobar").rot13() > [/code] > > or in Ruby > [code] > class MyStr < String > def rot13 > tr("A-Za-z", "N-ZA-Mn-za-m") > end > end > > MyStr.new("foobar").rot13 > [/code] > > His main argument was just that, "It's the Wrong Way (TM) to do it". To > me, it just seems like extra code and added complexity. > > Can you enligthen me and tell me if it's really that bad an idea to add > methods to an existing class, or if he's just being a Python zealot? > I can't speak of it being a bad idea, but a related feature of Ruby that may be even more important than extending classes is extending objects. (I don't know, can Python even dream of doing this?) irb(main):001:0> s = "fred" "fred" irb(main):002:0> module Fred irb(main):003:1> def rot13 irb(main):004:2> tr("A-Za-z","N-ZA-Mn-za-m") irb(main):005:2> end irb(main):006:1> end nil irb(main):007:0> s.extend Fred "fred" irb(main):008:0> s.rot13 "serq" In this case I don't pollute the class and I don't have to make the expense of subclassing a big class like String. > -- > > Vincent Foley-Bourgon > Email: vinfoley / iquebec.com > Homepage: http://darkhost.mine.nu:81 Jim -- Jim Freeze ---------- Programming Ruby def initialize; fun; end A language with class