Beginner question

Hi

I wrote about Ruby a year ago, I find it intersting, so I bought "Hal
Fulton's" book "the Ruby way", but I haven'thad time to read it until now.

Tho book is really good, but the writer don't explain this construction (from
page 81) (or I haven't found the explanation):

class String
    def rot13
        self.tr!("A-Ma-mN-Zn-z", "N-Zn-zA-Ma-m")
    end
end

str = "Micke"

puts "#{str} become #{str.rot13()}" #Micke become Zvpxr
puts "#{str} become #{str.rot13()}" #Zvpxr become Micke
puts "#{str} become #{str.swapcase()}" #Micke become mICKE

For me looks like we are doing some implicit inherence here, like this:
class String < String
    def rot13
        self.tr!("A-Ma-mN-Zn-z", "N-Zn-zA-Ma-m")
    end
end

Dose any one have a good explanation?

Regards,
Mike

Mikael Larsson wrote:

Tho book is really good, but the writer don't explain this construction (from page 81) (or I haven't found the explanation):

class String
    def rot13
        self.tr!("A-Ma-mN-Zn-z", "N-Zn-zA-Ma-m")
    end
end

[snip]

For me looks like we are doing some implicit inherence here, like this:
class String < String
    def rot13
        self.tr!("A-Ma-mN-Zn-z", "N-Zn-zA-Ma-m")
    end
end

Dose any one have a good explanation?

Hi, Mikael...

I think you're failing to understand that Ruby's classes are "open" --
i.e., all we're doing here is adding a new method to the String class.

All instances of String have access to that method once you add it.
(Even the ones that existed before the method was added.)

Does that help any?

Hal

Mikael Larsson wrote:

class String
    def rot13
        self.tr!("A-Ma-mN-Zn-z", "N-Zn-zA-Ma-m")
    end
end

str = "Micke"

puts "#{str} become #{str.rot13()}" #Micke become Zvpxr
puts "#{str} become #{str.rot13()}" #Zvpxr become Micke
puts "#{str} become #{str.swapcase()}" #Micke become mICKE

For me looks like we are doing some implicit inherence here, like this:
class String < String
    def rot13
        self.tr!("A-Ma-mN-Zn-z", "N-Zn-zA-Ma-m")
    end
end

Dose any one have a good explanation?

What you're seeing is the fact that you can reopen a class and add new
methods to it at any time. Your String class doesn't inherit from the
original String class; it *is* the original String class. You're adding a
new method to that class.

Try this example for comparison:

···

###

class Test
    def a
        123
    end
end

test = Test.new
p test.a

class Test
    def b
        a
    end
end

p test.a
p test.b

###

-Mike