Forum: Ruby Global Array?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Sy Y. (Guest)
on 2007-05-26 07:11
I've got a class which calls itself several times (recursive). While
this class is calling itself, I want it to be appending a global array (
<< ). I can't figure out how to make the array itself global, so for now
each time the class calls itself, it creates the array anew again. Help?
Trans (Guest)
on 2007-05-26 07:24
(Received via mailing list)
On May 25, 11:11 pm, Sy Ys <removed_email_address@domain.invalid> wrote:
> I've got a class which calls itself several times (recursive). While
> this class is calling itself, I want it to be appending a global array (
> << ). I can't figure out how to make the array itself global, so for now
> each time the class calls itself, it creates the array anew again. Help?

Have some code?

Try:

  $a = []

T.
highlyjhi (Guest)
on 2007-05-26 07:27
(Received via mailing list)
On May 25, 2007, at 11:11 PM, Sy Ys wrote:

>
Are you putting a dollar sign ($) in front of the variable's name?

ex: $global_array
Dan Z. (Guest)
on 2007-05-26 07:33
(Received via mailing list)
Sy Ys wrote:
> I've got a class which calls itself several times (recursive). While
> this class is calling itself, I want it to be appending a global array (
> << ). I can't figure out how to make the array itself global, so for now
> each time the class calls itself, it creates the array anew again. Help?
>

class Klass
   def recurse
     $klasses = Array.new  unless \
       global_variables.include?("$klasses") and $klasses.is_a?(Array)
     unless $klasses.size > 40
       k = Klass.new
       $klasses << k
       k.recurse
     end
   end
end

Note that I found the "and $klasses.is_a?(Array)" bit necessary because
the parser seems to initialize the global array $klasses when it first
comes across the word. Might I suggest using a class level variable
instead (@@klasses)? It seems appropriate. They are "almost global."

Dan
Robert K. (Guest)
on 2007-05-26 12:05
(Received via mailing list)
On 26.05.2007 05:32, Dan Z. wrote:
>       global_variables.include?("$klasses") and $klasses.is_a?(Array)
> comes across the word. Might I suggest using a class level variable
> instead (@@klasses)? It seems appropriate. They are "almost global."

No, rather use a class instance variable.  But even that has problems
because it is not thread safe.

The solution really depends on the problem to solve.  Maybe it's a
global variable, maybe it's a thread local, maybe it's a parameter like
in

def foo(x=[])
   if ...
     # recursion
     foo(x)
   else
     # termination
   end
end

... or maybe it's even another class with an instance variable, i.e.
factor out the recursive functionality into another class.

It all depends...

  robert
Sy Y. (Guest)
on 2007-05-26 17:09
Went with this. Thanks

Dan Z. wrote:
> Might I suggest using a class level variable
> instead (@@klasses)? It seems appropriate. They are "almost global."
Paul S. (Guest)
on 2007-05-26 21:52
(Received via mailing list)
If it's a class calling itself, vs. an object (instance of the class)
calling itself, why not use instance variables of the class? Or ...
need more input on the exact problem.

"Global variables" and recursion sound like a bad idea in general
(could you not just pass the object through each recursive call?)
This topic is locked and can not be replied to.