Wow, keep this up and you can boil a whole application down into a single obtuse statement :-) On Monday 29 October 2001 04:45 pm, you wrote: > Hi everyone, remember this? > > >I'm constantly creating small classes, and many of them start something > >like: > > class Msg > > def initialize(name, type, txt) > > @name, @type, @txt = name, type, txt > > end > > # ... > > end > > Yeah, it's a classic, RCR #3. We all hate repetition and typing > stuff that is obvious, right? > > Last time it was Joe McDonald who said: > > and if you have a sec, vote on RCR #3. It's a pet peeve of mine. > > I think it's a pet peeve for a lot of us but I can see why > RCR #3 was rejected as it stands now. > What would it mean for example, if you created another > function in the same way, like def func(@instance_var) - > is @instance_var assigned also in that case? > If not, why should there be a special case for initialize? > > So instead I propose to extend on the much loved shortcut > methods that exist for accessors. > > I.e. attr_accessor :a, :b, :c creates getters and setters for > @a, @b and @c so why not: > > class Mine > attr_initializer :a, :b, :c > ... > end > > attr_initializer creates an initializer > for them: > > def initialize(a, b, c) > @a, @b, @c = a, b, c > end > > So there's the idea - I thought it was quite nice but > now comes the fun part. I love this - when you get a good idea, > often it's easy to implement in Ruby without touching any > interpreter or such! For example, if you didn't get this yet, > notice that "attr_accessor" and the like are described in docs as > being just plain methods, in the class Module! > > So in some spare time at RubyConf and OOPSLA I fooled around with this > and got really positive responses, for example at the BOF session > at OOPSLA. > Trying it out for real makes a much better impact. > Using the eval-family of functions and the open classes, for > example "Class" and "Module", you can do a lot of cool stuff > that looks a lot like extentions of the language syntax, so here > is my implementation of attr_initializer: > > # file: AttrInitializer > class Module > def attr_initializer(*attrs) > alist = plist = "" > attrs.each do |v| > alist += "@#{v}," # >> @var1,@var2,@var3, ... > plist += "#{v}," # >> var1,var2,var3, ... > end > alist.chop!; plist.chop! # Remove last comma > class_eval "def initialize(#{plist}); #{alist} = #{plist}; end" > end > end > > Since the Class class inherits from Module, now you can just > require this file and you are able to use the attr_initializer > shortcut in all classes. > > > OK, now let's keep it going. What else is common to define in many > classes? Well, the default definition of equality is that the > compared references must be refs to the same object. However, it is > more common to want to compare (part of) the inner state of objects > and if they are equal, then the two different objects should be > considered equal. > > So you end up often defining == in your classes, like this, right? > > class Mine > attr_accessor :foo, :bar, :moo > # @foo, @bar, and @moo are my > # important inner state > > def ==(obj) > @foo = obj.foo && > @bar = obj.bar && > @moo = obj.moo > end > end > > Nowadays I just do this: > > class Mine > attr_equality :foo, :moo, :bar > ... > end > > Another option is to leave out the names of objects to make > it even simpler. This requires the equality function to introspect > self and the compared object to find all their instance vars. > > class Mine > attr_equality > ... > end > > I won't post the implementation of attr_equality because it's > longish, to support also the second option but you get the > idea from the attr_initializer example. > > I'll make an RCR for this and we'll see if people like it. > If you want a full implementation of both shortcuts > with some tests to go with them Drop me an email directly. > Don't reply to the list by mistake... > (Yes, XP-enthusiasts, I wrote the tests first! Great isn't it? > Although I updated them to run with Lapidary later) > > Have fun > > /Gunnar > > --- > Gunnar Andersson > gand -at- acm.org > > > __________________________________________________ > Do You Yahoo!? > Make a great connection at Yahoo! Personals. > http://personals.yahoo.com