2007/11/14, furtive.clown / gmail.com <furtive.clown / gmail.com>:
> Let's compare them again.  I changed some variable names which will
> hopefully remove that red herring from the conversation.  I also made
> the styles more consistent for better comparison.  (I was going to
> show both my style and your one-liner style, but it was too
> distracting.)
>
> Temporaries in the scope of the target all_files:
>
>   data_files = stems.map { |stem|
>      "#{ stem }.#{ guess_extension stem }"
>   }
>   basenames =
>      add_suffixes(source_files + add_prefixes(data_files))
>   all_files = basenames.map { |basename|
>      File.join dir, basename
>   }
>
> Temporaries inside block chains:
>
>    all_files = stems.map { |stem|
>       "#{ stem }.#{ guess_extension stem }"
>    }.as { |data_files|
>       add_suffixes(source_files + add_prefixes(data_files))
>    }.map { |basename|
>       File.join dir, basename
>    }
>
> (BTW 'suffix' here means the chars right before the dot; after the dot
> I call the extension.)

Why do add_suffixes and add_prefixes have to be methods that work on a
collection instead of a single item?  Do they modify the collection in
any way or do they need information from other entries to do their
work on a single entry?

If not, I would change that and then you could do this:

all_files = (
  source_files +
  stems.map {|stem| add_prefix "#{ stem }.#{ guess_extension stem }"}
  ).map {|name| File.join dir, add_suffix(name)}

This is still pretty complex (but the algorithm is anyway) and you do
not need any temporaries outside of block parameters.  Also,
add_suffix and add_prefix will be relieved from iterating collections
and can be focussed on doing one thing properly.

Kind regards

robert

-- 
use.inject do |as, often| as.you_can - without end