sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    πŸ«› Lightbeans Update | Metallic and Roughness auto-applied in SketchUp 2025+ Download

    Attribute accessor - get all as an array?

    Scheduled Pinned Locked Moved Developers' Forum
    13 Posts 4 Posters 5.1k 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.
    • 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