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

    This tripped me up (again) today

    Scheduled Pinned Locked Moved Developers' Forum
    25 Posts 6 Posters 3.5k Views 6 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.
    • Dan RathbunD Offline
      Dan Rathbun
      last edited by

      @august said:

      I'm using SU 15, which is supposed to have Ruby 2.0 and Dan notes that dclone is in 1.9, so I'm confused.

      What I actually said was that the REXML library (beginning in Ruby 1.9,) modified the Array class, by adding the dclone method.

      In order to use it, you must either precede it's use with:
      require "rexml/document"
      or use a refinement.

      (1) Using the REXML library:
      ` require "rexml/document"

      true
      a = []
      []
      a.respond_to?(:dclone)
      true`

      (2) Refinement module:

      <span class="syntaxdefault"><br />module&nbsp;August<br />&nbsp;&nbsp;module&nbsp;DeepCopy<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;refine&nbsp;</span><span class="syntaxkeyword">Array&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">def&nbsp;dclone<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;klone&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">.clone<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">klone</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">clear<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">each</span><span class="syntaxkeyword">{|</span><span class="syntaxdefault">v</span><span class="syntaxkeyword">|&nbsp;</span><span class="syntaxdefault">klone&nbsp;</span><span class="syntaxkeyword"><<&nbsp;</span><span class="syntaxdefault">v</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">dclone</span><span class="syntaxkeyword">}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">klone<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span class="syntaxcomment">#&nbsp;class&nbsp;Array<br /><br />&nbsp;&nbsp;</span><span class="syntaxdefault">end&nbsp;</span><span class="syntaxcomment">#&nbsp;refinement&nbsp;module&nbsp;DeepCopy<br /></span><span class="syntaxdefault">end&nbsp;</span><span class="syntaxcomment">#&nbsp;Author's&nbsp;namespace<br /><br /><br /></span><span class="syntaxdefault">using&nbsp;August</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">DeepCopy<br /><br />module&nbsp;August<br />&nbsp;&nbsp;module&nbsp;SomePlugin<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span class="syntaxkeyword">=&nbsp;[</span><span class="syntaxstring">"august"</span><span class="syntaxkeyword">,</span><span class="syntaxstring">"dan"</span><span class="syntaxkeyword">,</span><span class="syntaxstring">"tig"</span><span class="syntaxkeyword">]<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">b&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">a</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">dclone<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;</span><span class="syntaxstring">"a&nbsp;is;&nbsp;#{a.inspect}"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">puts&nbsp;</span><span class="syntaxstring">"b&nbsp;is;&nbsp;#{b.inspect}"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">puts&nbsp;</span><span class="syntaxstring">"changing&nbsp;a[1]&nbsp;to&nbsp;\"bob\""<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">a</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]=&nbsp;</span><span class="syntaxstring">"bob"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">puts&nbsp;</span><span class="syntaxstring">"a&nbsp;is;&nbsp;#{a.inspect}"<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">puts&nbsp;</span><span class="syntaxstring">"b&nbsp;is;&nbsp;#{b.inspect}"<br /><br />&nbsp;&nbsp;</span><span class="syntaxdefault">end&nbsp;</span><span class="syntaxcomment">#&nbsp;module&nbsp;SomePlugin<br /></span><span class="syntaxdefault">end&nbsp;</span><span class="syntaxcomment">#&nbsp;Author's&nbsp;namespace<br />&nbsp;</span><span class="syntaxdefault"></span>
      

      Any call to using() must occur within the TOPLEVEL_BINDING.
      This restriction has been removed in later versions of Ruby 2.2+, and the experimental warning that is output on calls to refine has also been removed. (Ie, refinements are no longer experimental and calls to using can happen inside specific module and class scopes.)

      If you want to see that all the elements of the arrays are different objects, you can iterate them and compare their object id numbers.

      I'm not here much anymore.

      1 Reply Last reply Reply Quote 0
      • A Offline
        August
        last edited by

        Thanks Dan,

        So refine allows me to add my own operators to an existing class? That's a sweet (and dangerous) concept.

        I'll have to put that on the back burner for now. I'm still working on basic Ruby.

        “An idea, like a ghost, must be spoken to a little before it will explain itself.”
        [floatr:v1mcbde2]-- Charles Dickens[/floatr:v1mcbde2]

        1 Reply Last reply Reply Quote 0
        • Dan RathbunD Offline
          Dan Rathbun
          last edited by

          @august said:

          So refine allows me to add my own operators to an existing class? That's a sweet (and dangerous) concept.

          Refinements do not affect other people's scripts that do not "use" the refinement module. (They are only valid within the file that has the using call.)

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • Dan RathbunD Offline
            Dan Rathbun
            last edited by

            Another basic concept is the mixin module, which uses include() and extend().

            In this case, in order to affect only the array you are using, you need to only "extend" the specific array instance object.

            So, assume you have previously loaded a mixin module thus:

            <span class="syntaxdefault">module August<br />  module DeepCopy<br /><br />    def dclone<br />      klone </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">.clone<br /></span><span class="syntaxdefault">      klone</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">clear<br />      self</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">each</span><span class="syntaxkeyword">{|</span><span class="syntaxdefault">v</span><span class="syntaxkeyword">|</span><span class="syntaxdefault"> klone </span><span class="syntaxkeyword"><<</span><span class="syntaxdefault"> v</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">dclone</span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">      klone<br />    end<br /><br />  end </span><span class="syntaxcomment"># mixin module DeepCopy<br /></span><span class="syntaxdefault">end </span><span class="syntaxcomment"># Author's namespace&nbsp;</span><span class="syntaxdefault"></span>
            

            Then you need to extend a specific array instance:

            <span class="syntaxdefault">a </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">[</span><span class="syntaxstring">"august"</span><span class="syntaxkeyword">,</span><span class="syntaxstring">"dan"</span><span class="syntaxkeyword">,</span><span class="syntaxstring">"tig"</span><span class="syntaxkeyword">]<br /><br /></span><span class="syntaxdefault">a</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">extend</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">August</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">DeepCopy</span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxdefault">b </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> a</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">dclone</span>
            

            I'm not here much anymore.

            1 Reply Last reply Reply Quote 0
            • A Offline
              August
              last edited by

              Back to TIG's comment about plural vs. singular names for arrays, here is the way I'm naming things. In this context, the singular terms seem to work better for me, probably because I think of it as the mathematical notation P[sub:2dctu78y]0[/sub:2dctu78y], P[sub:2dctu78y]1[/sub:2dctu78y], ... P[sub:2dctu78y]N[/sub:2dctu78y].

              =begin
              
                        point[N]
                                x-------------x point[0]  angle[0] = angle_between vector[N], vector[0]
                                   vector[N]   \
                vector[N] = point[N], point[0]  \
                                                 \
                                        vector[0] \
                    vector[0] = point[0], point[1] \
                                                    x point[1]  angle[1] = angle_between vector[0], vector[1]
                                                   /
                                        vector[1] /
                  vector[1] = point[1], point[2] /
                                                /
                                               /
                                              x point[2]  angle[2] = angle_between vector[1], vector[2]
              
              =end
              

              “An idea, like a ghost, must be spoken to a little before it will explain itself.”
              [floatr:v1mcbde2]-- Charles Dickens[/floatr:v1mcbde2]

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

              Advertisement