[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Where and how is defined "attr_accessor"?

Iñaki Baz Castillo

4/29/2008 11:03:00 PM

Hi, I've done some custom "field_accessor" (similar to "attr_accessor" but=
=20
with some neccessary difference). It works perfectly if I=20
defined "field_accessor" in the same class:

class Header
def self.field_accessor(name)
module_eval %{ def #{name}() .... end }
end
end

class From < Header
field_accessor :user, :domain
end


But I'd like to have field_accessor definition out of "Header" class, maybe=
in=20
a module but don't get it working. If I do:

module FieldAccessor
module_eval %{ def #{name}() .... end }
end

class From
include FieldAccessor
field_accessor :user, :domain
end


Then I get:
NoMethodError: undefined method `field_accessor' for From:Class


Later I've tryed with the following and it seems to work:

module FieldAccessor
module_eval %{ def #{name}() .... end }
# It also works with "class_eval".
end

class From
extend FieldAccessor
field_accessor :user, :domain
end



So, while I was writting this mail I found the solution, but would like to=
=20
know if it's the correct way. Thanks a lot.

=2D-=20
I=C3=B1aki Baz Castillo

2 Answers

Iñaki Baz Castillo

4/29/2008 11:27:00 PM

0

El Mi=C3=A9rcoles, 30 de Abril de 2008, David A. Black escribi=C3=B3:
> The last two definitions of FieldAccessor look wrong; you haven't
> defined the field_accessor method. But assuming that you correct that,
> then yes, extending your class is the best way.

Yes, sorry, what I did is:

module FieldAccessor
def self.field_accessor(name)
module_eval %{ def #{name}() .... end }
# It also works with "class_eval".
end
end

class From
extend FieldAccessor
field_accessor :user, :domain
end



> To answer the question in your subject line: attr_accessor is an
> instance method of Module. That's why all modules and classes can call
> it. You could add field_accessor to Module, but extend is cleaner.

Nice to know, so I was in the good way ;)

Thanks a lot for your help.



=2D-=20
I=C3=B1aki Baz Castillo

Ken Bloom

5/1/2008 5:12:00 AM

0

On Tue, 29 Apr 2008 18:26:39 -0500, Iñaki Baz Castillo wrote:

> El Miércoles, 30 de Abril de 2008, David A. Black escribió:
>> The last two definitions of FieldAccessor look wrong; you haven't
>> defined the field_accessor method. But assuming that you correct that,
>> then yes, extending your class is the best way.

Another reasonable place is in class Module. See Ruby Quiz #67:
Metakoans, which involved creating an attr_accessor like method.
http://www.rubyquiz.com/q...

--Ken

--
Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...