From: "yermej@..." Date: 2007-10-18T04:55:03+09:00 Subject: Re: How to combine blocks and recursiveness On Oct 17, 12:36 pm, Luis wrote: > Hello, > > I am trying to code a method that accepts a block... easy. The problem > is that this method is recursive, so I don't know how to pass the > block through the recursive calls. > > The specific code is about recurising through a directory tree while > calling the provided code block once per each directory, passing the > list of files in that directory. This is the code: > > class DirInfo > > # constructor, etc. removed for clarity > > def scan > @path.each_entry do |p| > next if p.to_s == "." || p.to_s == ".." > p = @path + p > if p.file? > finf = FileInfo.new(p) > @files << finf > elsif p.directory? > dinf = DirInfo.new(p) > dinf.scan # ==> Recursive search of subdirs > end > end > yield @path, @files > end > > end > > So if I do: > > di = DirInfo.new("/devtools/ruby") > di.scan do |path, files| > puts "Directory #{path} has #{files.length} files" > end > > I expect to get my block called once per each subdirectory, passing > the subdir path and list of files in that subdir. The problem is that > the fisrt time the call scan is made from within scan, no block is > given, so I get a "no block given" exception and the program stops. > > I know there are other ways to scan directories, but please take it > just as an example. Still the question is, how to combine > recursiveness with blocks? > > Thanks in advance, > > Luis. You can make the block argument explicit: def scan(&block) # do stuff scan &block # <== recursive call with block yield end I think that'll work.