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