[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

define_method inside a module

MR Damien

10/18/2008 11:58:00 AM

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-....

6 Answers

MR Damien

10/18/2008 12:00:00 PM

0

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-....

Joel VanderWerf

10/18/2008 6:52:00 PM

0

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

MR Damien

10/20/2008 7:57:00 AM

0

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-....

David A. Black

10/20/2008 11:19:00 AM

0

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

etc.


David

--
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.r... for details and updates!

Robert Klemme

10/20/2008 11:42:00 AM

0

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

MR Damien

10/23/2008 8:51:00 AM

0

Thanks for you answers, I will check that.
--
Posted via http://www.ruby-....