From: matt@... (matt neuburg) Date: 2009-03-16T03:27:44+09:00 Subject: Re: can I tighten this up with block or eval? Gary Wright wrote: > On Mar 15, 2009, at 1:17 PM, matt neuburg wrote: > > This works but seems heavy-handed. I feel I should be able to do it > > without the anonymous class having any initialize method at all. The > > whole situation has "closure" written all over it. So I tried to > > define > > the hello method to accomplish the same thing using evals and blocks > > and > > other tricky stuff, and became hopelessly confused. Could someone > > straighten me out? Thx - m. > > Here is one possibility. Note, I changed ClassMaker to a module > since it is really just a factory for creating classes and doesn't > really need to create intermediate instances of ClassMaker to > accomplish your goal. > > module ClassMaker > def self.greeter(greeting) > Class.new do > define_method :hello do > puts greeting # this is the nub of the matter > end > end > end > end > ClassMaker.greeter("gday").new.hello Actually, I have to keep the architecture I've got - greeter is going to be called without a parameter, that's just how it is. (The problem as I posed it is just a schematic reduction of a vast existing architecture that does something else entirely.) However, your solution shows me exactly the trick I was missing: I need to turn @howdy into a local so that a block can see it: class ClassMaker def initialize(s); @howdy = s; end def greeter greeting = @howdy # the magic step! Class.new do define_method :hello do puts greeting end end.new end end ClassMaker.new("gday").greeter.hello Thanks! It's nice to stop banging myself over the head with a hammer... :) m. -- matt neuburg, phd = matt@tidbits.com, http://www.tidbits.com/matt/ Leopard - http://www.takecontrolbooks.com/leopard-customizing.html AppleScript - http://www.amazon.com/gp/product/0596102119 Read TidBITS! It's free and smart. http://www.tidbits.com