Beginner's question about passing arrays as arguments to methods

I am doing a little script that builds an array (called darray) of all
filenames in a directory tree. I am doing this by recursively calling
a method (called enter_dir) and passing the partially filled array
(called darray) down through the recursive calls.

The code works, but I am concerned about the efficiency of passing what
is potentially quite a large array around so many times. Should I be
concerned about this or not?

I also wrote the code using a global array ($darray) and this worked
too and didn't need to array to be passed down through the recursions.

What are the pros and cons of these two approaches?

def enter_dir(this_dir, darray)
farray = []
this_dir.each {|fname|
  farray << fname
  }
farray.each {|fname|
  file_path = this_dir.path + '/' + fname
  if File.stat(file_path).directory?
    this_dir_sub = Dir.new(file_path)
    if fname != '.' && fname != '..'
      enter_dir(this_dir_sub, darray)
    end
  else
    darray << file_path
  end
}
end

this_dir = Dir.new('/home/tony/Ruby/dot_recycle')
darray = []
enter_dir(this_dir, darray)
puts darray

You're not actually passing the array around whenever you call
enter_dir, rather you're passing a reference to the object, so the
performance penalties should not be noticable at all.

Farrel

···

On 13/11/06, gigaday@googlemail.com <gigaday@googlemail.com> wrote:

I am doing a little script that builds an array (called darray) of all
filenames in a directory tree. I am doing this by recursively calling
a method (called enter_dir) and passing the partially filled array
(called darray) down through the recursive calls.

The code works, but I am concerned about the efficiency of passing what
is potentially quite a large array around so many times. Should I be
concerned about this or not?

I also wrote the code using a global array ($darray) and this worked
too and didn't need to array to be passed down through the recursions.

What are the pros and cons of these two approaches?

def enter_dir(this_dir, darray)
farray =
this_dir.each {|fname|
  farray << fname
  }
farray.each {|fname|
  file_path = this_dir.path + '/' + fname
  if File.stat(file_path).directory?
    this_dir_sub = Dir.new(file_path)
    if fname != '.' && fname != '..'
      enter_dir(this_dir_sub, darray)
    end
  else
    darray << file_path
  end
}
end

this_dir = Dir.new('/home/tony/Ruby/dot_recycle')
darray =
enter_dir(this_dir, darray)
puts darray

Farrel Lifson <farrel.lifson <at> gmail.com> writes:

You're not actually passing the array around whenever you call
enter_dir, rather you're passing a reference to the object, so the
performance penalties should not be noticable at all.

Farrel

Hopefully that makes sense, but if it doesn't, imagine tying a long piece of
string to a large rock and then giving the other end of the string to someone to
hold

Or there's always the Binky Pointer video:

-Harold

···

On 11/13/06, Gareth Adams <gareth.adams@gmail.com> wrote:

Farrel Lifson <farrel.lifson <at> gmail.com> writes:

>
> You're not actually passing the array around whenever you call
> enter_dir, rather you're passing a reference to the object, so the
> performance penalties should not be noticable at all.
>
> Farrel
>

Hopefully that makes sense, but if it doesn't, imagine tying a long piece of
string to a large rock and then giving the other end of the string to someone to
hold