Define_method inside a module


#1

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)


#2

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)”


#3

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


#4

Hi –

On Mon, 20 Oct 2008, MR Damien wrote:

c.bar
if self.instance_variable_get(name)

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


#5

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)


#6

2008/10/20 David A. Black removed_email_address@domain.invalid:

end
end

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


#7

Thanks for you answers, I will check that.