Where and how is defined "attr_accessor"?

Discussion in 'Ruby' started by Iñaki Baz Castillo, Apr 30, 2008.

  1. 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
     
    Iñaki Baz Castillo, Apr 30, 2008
    #1
    1. Advertising

  2. 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
     
    Iñaki Baz Castillo, Apr 30, 2008
    #2
    1. Advertising

  3. Iñaki Baz Castillo

    Ken Bloom Guest

    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/quiz67.html

    --Ken

    --
    Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
    Department of Computer Science. Illinois Institute of Technology.
    http://www.iit.edu/~kbloom1/
     
    Ken Bloom, May 1, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Oodini
    Replies:
    1
    Views:
    1,836
    Keith Thompson
    Sep 27, 2005
  2. Jim Cain
    Replies:
    0
    Views:
    105
    Jim Cain
    Jul 18, 2003
  3. David Garamond
    Replies:
    1
    Views:
    103
    Dan Doel
    Jan 25, 2004
  4. Jack, Paul
    Replies:
    2
    Views:
    120
    Robert Klemme
    Dec 16, 2004
  5. Tim Becker
    Replies:
    5
    Views:
    122
    Daniel Berger
    Nov 29, 2006
Loading...

Share This Page