From: Eric Mahurin Date: 2005-09-26T13:01:43+09:00 Subject: Re: Overloading --- Ben wrote: > I'm a C++ programmer learning Ruby. I would like to make a > class that > extracts patterns from a file, and returns an array of > values. I > have: > > class Extracter > def initialize(pattern, location) > @pattern = pattern > @loc = location > end > def extract(stream) > pats = Array.new > stream.each_line do |line| > if line =~ @pattern then > pats << $~[@loc] > end > end > pats > end > end > > cppFile = File.new("foo.cpp") > incEx = Extracter.new(/#include\s*[<"](.*)[>"]/, 1) > includesArr = incEx.extract(ccpFile) > > So far, so good. If not, let me know what I've done wrong. > Next, I > want to extend the Extracter class to hold an array of > patterns and > locations, or a Proc parser that will return the interesting > value > (this is for lines that are tougher than regexp). How do I > create a > constructor that will take different types and create the > appropriate > arrays internally? The options I see are: > > 1) Call .class.to_s on each parameter to match the type: > "pattern.class.to_s =~ /Array/ then # I have an array > of regexp > 2) Use a non-trvial data structure to map symbols to types > 3) Use different functions to fill out my extracter: > def add_array > def add_parser #3 is the best solution for ruby and is the ruby way. What's the downside? The deeper you get into ruby, the more you'll find out that overloading methods based on type dillutes flexibility, offers no advantage, and gives ugly/less readable code. Overloading methods based on other things (number of args, flags, etc) is definitely better, but still has some of the same disadvantages. I try to avoid overloading based on type at almost all costs and sometime overload based on other criteria. > What am I missing? Am I doing this entirely wrong for Ruby? > > -Ben > > __________________________________ Yahoo! Mail - PC Magazine Editors' Choice 2005 http://mail.yahoo.com