Define_method inside a module

hi,

I am trying to use some dynamic features of ruby.

Inside my module, I try to add some method dynamicaly but I get an error
when I am trying to.

module Rubyhaviour
  def add(object)
    name = "@" + object.class.downcase

    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

      define_method(name) do
        instance_variable_get("@#{name}")
      end
    end
  end
end
undefined method `define_method' for #<Test:0x2ce631c> (NoMethodError)

···

--
Posted via http://www.ruby-forum.com/.

MR Damien wrote:

hi,

I am trying to use some dynamic features of ruby.

Inside my module, I try to add some method dynamicaly but I get an error
when I am trying to.

module Rubyhaviour
  def add(object)
    name = "@" + object.class.downcase

    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

      define_method(name) do
        instance_variable_get("@#{name}")
      end
    end
  end
end
undefined method `define_method' for #<Test:0x2ce631c> (NoMethodError)

I pushed enter too fast, here are the missing code

class Test
  include Rubyhaviour
end

test = test.add(some_object)
Then I get "undefined method `define_method' for #<Test:0x2ce631c>
(NoMethodError)"

···

--
Posted via http://www.ruby-forum.com/\.

MR Damien wrote:

hi,

I am trying to use some dynamic features of ruby.

Inside my module, I try to add some method dynamicaly but I get an error
when I am trying to.

module Rubyhaviour
  def add(object)
    name = "@" + object.class.downcase

    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

      define_method(name) do
        instance_variable_get("@#{name}")
      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

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

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)
--
Posted via http://www.ruby-forum.com/\.

Hi --

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

etc.

David

···

On Mon, 20 Oct 2008, MR Damien wrote:

--
Rails training from David A. Black and Ruby Power and Light:
   Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL
   Advancing with Rails January 19-22 Fort Lauderdale, FL *
   * Co-taught with Patrick Ewing!
See http://www.rubypal.com for details and updates!

Also, watch closely the contents of "name" and how you (OP) use it.

robert

···

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

--
remember.guy do |as, often| as.you_can - without end

Thanks for you answers, I will check that.

···

--
Posted via http://www.ruby-forum.com/.