From: Brian Candler Date: 2010-02-15T18:41:11+09:00 Subject: Re: 'def', but with a closure Robert Klemme wrote: > You can at least shorten it a bit > > @cars.each do |owner, model| > widget = TkLabel.new(:text => model) > (class << widget; self; end).send(:define_method, :get_owner) do > owner > end > end You can use a block (non-string) eval, which isn't quite as short but avoids the 'send'. It's nicer if you have a whole bunch of define_method calls. @cars.each do |owner, model| widget = TkLabel.new(:text => model) (class << widget; self; end).class_eval do define_method(:get_owner) do owner end end end Or use an explicit instance variable instead of a closure. module Owner def get_owner @owner end end @cars = {"jim"=>"KA", "fred"=>"Porsche", "trunky"=>"Mini"} @cars.each do |owner, model| widget = TkLabel.new(:text => model) widget.extend Owner widget.instance_variable_set(:@owner, owner) # or: widget.instance_eval { @owner = owner } # or: widget.set_owner(owner) end -- Posted via http://www.ruby-forum.com/.