Array#to_h

Problem is - which .to_h is intuitive. There's a to_h in nano:

http://nano.rubyforge.org/doc/classes/Array.html#M000057

You can already do:

a = [1, 2, 3, 4, 5]
hash = a.inject({}) {|h,x| h = x*2}

Or:

class Array
  def to_h
    a.inject({}) { |h,x| h = yield(x) }
  end
end
hash = a.to_h { |x| x*2}

I think the inject method most clearly shows what's going on.

···

-----Original Message-----
From: Shannon Fang [mailto:xrfang@hotmail.com]
Sent: Tuesday, 25 October 2005 1:10 PM
To: ruby-talk ML
Subject: RCR: Array#to_h

Hi there,

I have registered 2 accounts for RCRkive, but all failed...
So I posted here.

Abstract

A simple method that construct a hash from an array. Just
like Hash#to_a return an array from hash.

Problem

Consider this cenario: I programmed a multi-threaded web page
downloader.
One of its input is an array of urls to download. In the
program, I wanted to use a hash like
{'http://ruby-lang.org/index.html' => '200'}, i.e., use a
hash to record the return code of the http request. This way
I can avoid re-download a page, or miss a page.

For the user of this download program, it is much easier to
use an Array instead of a Hash:

d = WebPageDownloader.new
d.links = IO.readlines('list.txt')

Hence, in the program we want to do:

@links = @links.to_h

Proposal

Add a method to_h (not to_hash) in the Array class, so that user can:

a = [1, 2, 3, 4, 5]
p a.to_h { |i, v| v * 2} --> {5=>10, 1=>2, 2=>4, 3=>6, 4=>8}
p a.to_h(3) --> {5=>3, 1=>3, 2=>3, 3=>3, 4=>3}

Anaysis

This is very convenient for users who need this feature, and
it will not affect behavior of the Array class in anyway for
those do not need this feature.

Please refer to RCR278, which is similar but not same.

Implementation

class Array
  public
  def to_h(value = nil)
    _hash = {}
    self.each_index do |i|
      v = self[i]
      if block_given? then
        _hash[v] = yield(i, v)
      else
        _hash[v] = value
      end
    end
    _hash
  end
end

Please comment.

Thanks,
Shannon

#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################

Daniel Sheppard wrote:

Problem is - which .to_h is intuitive. There's a to_h in nano:

http://nano.rubyforge.org/doc/classes/Array.html#M000057

You can already do:

a = [1, 2, 3, 4, 5]
hash = a.inject({}) {|h,x| h = x*2}

Won't work. This at least has to be

hash = a.inject({}) {|h,x| h = x*2;h}

Or:

class Array
def to_h
a.inject({}) { |h,x| h = yield(x) }

Same here:

a.inject({}) { |h,x| h = yield(x);h }

end
end
hash = a.to_h { |x| x*2}

I think the inject method most clearly shows what's going on.

Kind regards

    robert

i've been writing that this way lately, just because i looks better:

   hash = a.inject({}){|h,x| h.update x => x*2}

creates an xtra hash - but less anoying that ;h

-a

···

On Tue, 25 Oct 2005, Robert Klemme wrote:

Daniel Sheppard wrote:

Problem is - which .to_h is intuitive. There's a to_h in nano:

http://nano.rubyforge.org/doc/classes/Array.html#M000057

You can already do:

a = [1, 2, 3, 4, 5]
hash = a.inject({}) {|h,x| h = x*2}

Won't work. This at least has to be

hash = a.inject({}) {|h,x| h = x*2;h}

--

email :: ara [dot] t [dot] howard [at] noaa [dot] gov
phone :: 303.497.6469
anything that contradicts experience and logic should be abandoned.
-- h.h. the 14th dalai lama

===============================================================================