From: "Berger, Daniel" Date: 2005-05-18T03:38:33+09:00 Subject: Re: Forwardable, reworked > -----Original Message----- > From: Eric Hodel [mailto:drbrain@segment7.net] > Sent: Tuesday, May 17, 2005 11:05 AM > To: ruby-core@ruby-lang.org > Subject: Re: Forwardable, reworked > > > On 17 May 2005, at 04:36, Daniel Berger wrote: > > > --- Robert McGovern wrote: > > > >>> class Foo > >>> extend Forwardable > >>> > >>> delegate :to_i => :@number > >>> delegate [:to_s, :reverse] => :@string > >>> > >>> def initialize > >>> @number = 5 > >>> @string = "foobar" > >>> end > >>> end > > > > This should do the trick: > > > > def delegate(hash) > > hash.each{ |methods, accessor| > > methods = methods.to_s if methods.kind_of?(Symbol) > > methods.each{ |method| > > def_instance_delegator(accessor, method) > > } > > } > > end > > I think I would rather see: > > delegate :@number, :to_i > delegate :@string, :to_s, :reverse > > def delegate(ivar, *methods) > methods.each { |method| def_instance_delegator ivar, method } end It's six one way and half a dozen the other. Both look good to me, though the officially submitted patch uses the reversed, hash style that Florian originally suggested. If you feel strongly about it, please post a response to Patch 1923 on RubyForge. Matz and/or Tanaka may agree with you. > The kind_of? feels so clumsy. (And I forgot how String#each worked > since I never use it.) Actually, I replaced that line in the submitted patch with: methods = methods.to_s unless methods.respond_to?(:each). Just a wee bit of duck typing to keep things sane. Regards, Dan