Can anyone suggest an idiomatic ruby equivalent to this perl snippet?
my %index = map { $_ => compute_something($_) } @files;
Where @files is an array of filenames, and compute_something is a subroutine which does some probably expensive operation on the file.
The result is a hash indexing the file name to the computed result for that file. This and it's grep equivalent is something I find quite quite handy in perl.
The best I came up with so far seems reletively clunky to me:
index = Hash.new()
files.each {|f| index[f] = compute_something(f) }
or:
index = files.inject(Hash.new) {|i,f| i[f] = compute_something(f); i }
I was wondering if there's a more succinct and readable way?
Can anyone suggest an idiomatic ruby equivalent to this perl snippet?
my %index = map { $_ => compute_something($_) } @files;
Where @files is an array of filenames, and compute_something is a subroutine which does some probably expensive operation on the file.
The result is a hash indexing the file name to the computed result for that file. This and it's grep equivalent is something I find quite quite handy in perl.
The best I came up with so far seems reletively clunky to me:
index = Hash.new()
files.each {|f| index[f] = compute_something(f) }
or:
index = files.inject(Hash.new) {|i,f| i[f] = compute_something(f); i }
I was wondering if there's a more succinct and readable way?
I'm not aware of anything more succinct to do what you wrote here, but if you want to defer the expensive operation, you can do this:
index = Hash.new { |h,f| h[f] = compute_something(f) }
Maybe there should be something like this:
class Array
def hashmap
h={}
each {|x| h = yield x}
h
end
end
index = Hash::new{|h,f| h[f] = compute_something f}
hashes can take a block to define how to initialize new values based on keys.
one benefit is that this means the 'compute_something' bit is lazy.
hth.
-a
···
On Wed, 4 May 2005, Nick Woolley wrote:
Hi,
Can anyone suggest an idiomatic ruby equivalent to this perl snippet?
my %index = map { $_ => compute_something($_) } @files;
Where @files is an array of filenames, and compute_something is a
subroutine which does some probably expensive operation on the file.
The result is a hash indexing the file name to the computed result for
that file. This and it's grep equivalent is something I find quite
quite handy in perl.
The best I came up with so far seems reletively clunky to me:
index = Hash.new()
files.each {|f| index[f] = compute_something(f) }
or:
index = files.inject(Hash.new) {|i,f| i[f] = compute_something(f); i }
I was wondering if there's a more succinct and readable way?
TIA,
Nick
--
email :: ara [dot] t [dot] howard [at] noaa [dot] gov
phone :: 303.497.6469
renunciation is not getting rid of the things of this world, but accepting
that they pass away. --aitken roshi