sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Attribute accessor - get all as an array?

    Scheduled Pinned Locked Moved Developers' Forum
    13 Posts 4 Posters 4.9k Views 4 Watching
    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.
    • J Offline
      Jim
      last edited by

      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
      • thomthomT Offline
        thomthom
        last edited by

        @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

          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
          • Dan RathbunD Offline
            Dan Rathbun
            last edited by

            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
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              @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
              • Chris FullmerC Offline
                Chris Fullmer
                last edited by

                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
                • Dan RathbunD Offline
                  Dan Rathbun
                  last edited by

                  πŸ˜†

                  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
                  • Chris FullmerC Offline
                    Chris Fullmer
                    last edited by

                    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
                    • Dan RathbunD Offline
                      Dan Rathbun
                      last edited by

                      @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
                      • Chris FullmerC Offline
                        Chris Fullmer
                        last edited by

                        @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
                        • Dan RathbunD Offline
                          Dan Rathbun
                          last edited by

                          @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
                          • First post
                            Last post
                          Buy SketchPlus
                          Buy SUbD
                          Buy WrapR
                          Buy eBook
                          Buy Modelur
                          Buy Vertex Tools
                          Buy SketchCuisine
                          Buy FormFonts

                          Advertisement