On 26.04.2009 21:55, Rick DeNatale wrote: > On Sun, Apr 26, 2009 at 3:30 PM, Robert Klemme > <shortcutter / googlemail.com> wrote: >> On 26.04.2009 19:40, Tim Conner wrote: > >>> My code currently looks like this: >>> class BatchExternalBooking >>> def method_missing(method_sym, *args) >>> if method_sym.to_s =~ /^message_thread_([0-9]*)=?(\w*)?$/ >>> BatchExternalBooking.instance_eval "attr_accessor >>> :message_thread_#{$1}" >> You might rather want to use class_eval here. > > No instance_eval works just as well for sending attr_accessor to a > class/module. The only difference with class_eval is when using def to > define a method. I did not want to state that instance_eval is the issue. Sorry for being imprecise. A simple BatchExternalBooking.send "attr_accessor", "message_thread_#$1" would be sufficient. >> Also, as Robert pointed out already, using $1 only once and storing the >> value in a local variable is safer because it can be changed by any method >> you invoke. >> >>> self.send("message_thread_#{$1}=", $2) > > That's not true either. The $n variables are frame local, in a given > invocation frame they will only change when another regex match is > done in the same invocation. A simple test verifies this to be true. But now I wonder how I have come to this misconception. I am pretty sure I stored $1 in a local variable to avoid issues with changing values. Maybe I just had another match in the same method and extended the overwriting problem to method calls. Thank you for the education, Rick! Kind regards robert