• Login
sketchucation logo sketchucation
  • Login
๐Ÿค‘ SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

Attribute accessor - get all as an array?

Scheduled Pinned Locked Moved Developers' Forum
13 Posts 4 Posters 4.9k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    Chris Fullmer
    last edited by 14 Sept 2011, 03:41

    Any way to get all the atribute's of a class object - is that even the right terminology - returned as an array? I've made a class and I've used over 100 attribute accessors (to set "attributes", right?) which essentially just add instance methods to my object to set and get the attribute. But is there a way to somehow get a list of all those attributes, without having to maintain an array of them in my code? I've got so many, they change so often (due to the nature of the project development). I'd really rather noth have to maintain a separate list of all the attributes because it will be tedious to update.

    So is there some my_class_object.attributes.each { |att| att.puts } type method? I didn't see anything in the pickaxe, other than lsiting all instance methods, but that lists more than just the ones set as attribute_accessors.

    Anything like what I'm looking for available? Thanks,

    Chris

    Lately you've been tan, suspicious for the winter.
    All my Plugins I've written

    1 Reply Last reply Reply Quote 0
    • T Offline
      thomthom
      last edited by 14 Sept 2011, 07:50

      How did you define you attributes? Hard code them?
      One way would have been to make that array as an instance variable and use to to both define and keep it as an collection.

      I know... not the answer you where looking for...

      Thomas Thomassen โ€” SketchUp Monkey & Coding addict
      List of my plugins and link to the CookieWare fund

      1 Reply Last reply Reply Quote 0
      • J Offline
        Jim
        last edited by 14 Sept 2011, 08:02

        Using attr_accessor creates a pair of methods: method and method=

        You could get the list of methods, then if a method name has both the setter and getter form (method=), then it is an attribute. (Not fool-proof, but may work.)

        There is an instance_variables method, but it will not give you instance variables that have not yet been created.
        http://www.ruby-doc.org/core-1.8.6/classes/Object.html#M000036

        Hi

        1 Reply Last reply Reply Quote 0
        • T Offline
          thomthom
          last edited by 14 Sept 2011, 08:05

          @jim said:

          Using attr_accessor creates a pair of methods: method and method=

          You could get the list of methods, then if a method name has both the setter and getter form (method=), then it is an attribute.

          But you'll also get all attributes of the superclasses...

          Thomas Thomassen โ€” SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund

          1 Reply Last reply Reply Quote 0
          • J Offline
            Jim
            last edited by 14 Sept 2011, 08:12

            Maybe you could use RDoc or YARD document generator - it should be able to give you a pretty list.

            Hi

            1 Reply Last reply Reply Quote 0
            • D Offline
              Dan Rathbun
              last edited by 14 Sept 2011, 14:28

              You could create a temporary instance of your class... get it's instance_variables() array output, then destroy the instance.

              You might also consider (future coding,) whether having many separate instance vars is better or worse than collecting them all into a instance Hash or Ostuct. ( Ostuct is easier, it's a cross, functionally, between a Hash and attribute with accessors. You get the best of both. See "ostruct.rb" in the standard library.)

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • D Offline
                Dan Rathbun
                last edited by 14 Sept 2011, 22:24

                @dan rathbun said:

                You could create a temporary instance of your class... get it's instance_variables() array output, then destroy the instance.

                Actually I should know better. instance_methods() is a public class method, not an instance method, so ....

                ChrisClass.instance_methods(false)

                ... will return an Array of only those method names that YOU have defined, and not include the ones it inherits from it's ancestors.

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • C Offline
                  Chris Fullmer
                  last edited by 14 Sept 2011, 22:56

                  Yes, but it will also return methods were defined outside my attr_accessor section. I'll explain the quandary a little better, maybe that will help.

                  I have a vertex-like class. It has 130 separate attributes in the attr_accessor section. These are so I can assign a slew of simple descriptive data to the object. Like color, x,y,z,x1,y1,z,smell,temp,rubyobj,rubyid, etc, etc. These are all written out by hand in the code.

                  But, I also have a bunch of other public instance methods defined that do things to the "vertex" like my_class_object.animate, as an example. So the my_class_object.instance_methods won't quite do the trick here because that will return all the instance methods when I really just want the ones defined in the attr_accessor.

                  Maybe I need to think of it more on the instance_variable level. Perhaps I could do better returning all instance variables. I guess I would have to be careful not to use any other instance methods. But it might work.

                  I also liked jim's method. That might be enough.

                  Lately you've been tan, suspicious for the winter.
                  All my Plugins I've written

                  1 Reply Last reply Reply Quote 0
                  • D Offline
                    Dan Rathbun
                    last edited by 15 Sept 2011, 01:15

                    ๐Ÿ˜†

                    Chris.. YOU are the one writing the code!
                    You know what are attributes and what are not.

                    Perhaps you don't remember or are aware of the two "accordian" arglist operators ("*" and "&".)

                    Use the "*" operator like this:

                    module Fullmer
                      class NiftyVertex
                    
                        # create an Array of attributes;
                        @@atts = [;one,;two,;three]
                    
                        # use the * argument accordian operator to convert array to arglist
                        attr_accessor( *@@atts )
                    
                        # At this point the only instance_methods defined
                        #  will be the accessor methods;
                        @@accessor_methods = instance_methods(false).sort()
                    
                        def self.attributes()
                          @@atts
                        end
                    
                        def self.accessor_methods()
                          @@accessor_methods
                        end
                    
                        @@ivars = []
                    
                        def initialize
                          @someNonAttributeInstanceVar = 32
                          @anotherNonAttributeInstanceVar = "I'm special!"
                          #
                          @@ivars = instance_variables.sort()
                          # At this point @@ivars should NOT contain any attribute vars.
                          # This is built-in to the instance_variables() method.
                          #
                        end
                    
                        # define other instance methods ...
                    
                      end #class
                    end
                    

                    You can do a quick test at the Console:
                    class Dan; @@atts=[:one,:two,:three]; attr_accessor(*@@atts); def self.attributes(); @@atts; end; end

                    nil
                    Dan.instance_variables
                    []
                    Dan.attributes
                    [:one, :two, :three]
                    Dan.instance_methods(false)
                    ["one", "two=", "one=", "three", "two", "three="]

                    it may help to use .sort().. added into example above (but we cannot sort symbols.)

                    I'm not here much anymore.

                    1 Reply Last reply Reply Quote 0
                    • C Offline
                      Chris Fullmer
                      last edited by 15 Sept 2011, 01:26

                      Dan, that's exactly what I need! I just didn't know (well, remember) the bigger picture. I didn't know what the :variable syntax meant apparently. I thought it was a special syntax only to be used in the attr_accessor() method.

                      This was I can write the list out only once and access it as an array later in my code.

                      Sorry for being so dense and forgetful. I obviously need to re-read the basics (again) now that I'm to a point where I might understand more of it.

                      Lately you've been tan, suspicious for the winter.
                      All my Plugins I've written

                      1 Reply Last reply Reply Quote 0
                      • D Offline
                        Dan Rathbun
                        last edited by 15 Sept 2011, 01:31

                        @chris fullmer said:

                        I didn't know what the :variable syntax meant apparently.

                        :name is class Symbol

                        It's also called an interned String (sort of like a constant,) hence string.intern() returns a Symbol instance, and symbol.to_s returns a String instance.

                        I'm not here much anymore.

                        1 Reply Last reply Reply Quote 0
                        • C Offline
                          Chris Fullmer
                          last edited by 15 Sept 2011, 02:44

                          @dan rathbun said:

                          hence string.intern() returns a Symbol instance, and symbol.to_s returns a String instance.

                          That is great to know, because that is precisely what I will be doing with these is using these as strings to write out as xml tags, and to read in from xml so it will be useful to have those methods to switch between the symbol and the string version. Very useful, thanks Dan (et. al) for helping out!

                          Lately you've been tan, suspicious for the winter.
                          All my Plugins I've written

                          1 Reply Last reply Reply Quote 0
                          • D Offline
                            Dan Rathbun
                            last edited by 15 Sept 2011, 02:55

                            @chris fullmer said:

                            That is great to know, because that is precisely what I will be doing with these ...

                            Spooky! ๐Ÿ˜ฒ

                            .. now I'm answering your questions before you ask them.

                            (.. does anyone hear the "Jeopardy" theme?)

                            I'm not here much anymore.

                            1 Reply Last reply Reply Quote 0
                            • 1 / 1
                            1 / 1
                            • First post
                              2/13
                              Last post
                            Buy SketchPlus
                            Buy SUbD
                            Buy WrapR
                            Buy eBook
                            Buy Modelur
                            Buy Vertex Tools
                            Buy SketchCuisine
                            Buy FormFonts

                            Advertisement