Mac OS X coding

Extending Existing Classes Whenever You Want

April 18, 2007 · Leave a Comment

Minor Correction: The original name of this post was Extending Classes at Runtime. For Ruby, that title is okay. For ObjC , that title is wrong(AFAIK).

This is an powerful feature which two languages I know implement: Ruby and ObjC. In ObjC, you define a category and all the methods in the category will be added to the class at runtime. Therefore, even if you are using closed-source libraries, if you wanted to add a method/correct a method for the existing class, you can create a category and do so. In Ruby, it is even easier to extend classes at runtime:

Here’s a Ruby example(usual GPL disclaimers apply, you can also get the code in the file labeled extending_classes.rb from the Box widget on the right):
#!/usr/bin/env ruby
class Array

def sum
total = 0
self.each {|elem| total += elem.to_i if elem.methods.include?(to_i)}
total
end

# doesn’t do what is
# intended if elements don’t support a proper to_s
def split
self.collect! {|el| el.to_s.split(/\B/) if el.methods.include?(to_s) }
end

end

if __FILE__ == $0
a = Array.new([1,2,3,4,5,6])
b = Array.new
b << 3 << [1,2] << Foobah
c = Array.new(["a","b","c","d","1"])
puts a.sum is #{a.sum}
puts b.sum is #{b.sum}
puts c.sum is #{c.sum}
puts a.split is #{a.split}
puts b.split is #{b.split}
puts C’s contents:
c.each {|elem| puts elem}

end

Categories: Ruby