Robert Klemme
10/20/2008 11:42:00 AM
2008/10/20 David A. Black <dblack@rubypal.com>:
> Hi --
>
> On Mon, 20 Oct 2008, MR Damien wrote:
>
>> Joel VanderWerf wrote:
>>>
>>> MR Damien wrote:
>>>>
>>>> def add(object)
>>>> end
>>>> end
>>>> end
>>>> end
>>>> undefined method `define_method' for #<Test:0x2ce631c> (NoMethodError)
>>>
>>> Try working in the singleton class:
>>>
>>> class C
>>> def foo
>>> class << self
>>> define_method :bar do puts "BAR"; end
>>> end
>>> end
>>> end
>>>
>>> c = C.new
>>> c.foo
>>> c.bar
>>
>> Hi,
>>
>> seems not to work neither
>>
>>
>> ------------------
>> def add(object)
>> name = "@" + self.collection_name_for(object)
>>
>> if self.instance_variable_get(name)
>> self.instance_variable_get(name) << object
>> else
>> self.instance_variable_set(name, Array.new)
>> self.instance_variable_get(name) << object
>>
>> class << self
>> define_method(name) do
>> instance_variable_get("@#{name}")
>> end
>> end
>>
>> end
>> end
>> ------------------
>> in `define_method': interning empty string (ArgumentError)
>
> That's because name is not in scope inside the class definition body
> (class << self). In order to keep name in scope, you need to use
> class_eval on the singleton class. That way, you're operating inside a
> code block, which does share the local variables.
>
> (class << self; self; end).class_eval do
> define_method(name) do
Also, watch closely the contents of "name" and how you (OP) use it.
robert
--
remember.guy do |as, often| as.you_can - without end