hash.collect

  • Thread starter Joe Ruby MUDCRAP-CE
  • Start date
J

Joe Ruby MUDCRAP-CE

collect seems to work on a hash:

h = {'a'=>'1', 'b'=>'2'}

params = h.collect {|k, v| "#{k}=#{v}"}.join('&')

Yet collect isn't listed as a method of hash:
http://www.ruby-doc.org/core

Is it undocumented, or is some magic going on behind the scenes -- such
as the hash getting converted to an array?

Thanks,
Joe
 
J

Joel VanderWerf

Joe said:
collect seems to work on a hash:

h = {'a'=>'1', 'b'=>'2'}

params = h.collect {|k, v| "#{k}=#{v}"}.join('&')

Yet collect isn't listed as a method of hash:
http://www.ruby-doc.org/core

Is it undocumented, or is some magic going on behind the scenes -- such
as the hash getting converted to an array?

The Hash class includes the Enumerable module, which defines #collect in
terms of #each. In this case, Hash#each yields key,value pairs, so
#collect does too. It doesn't get converted to an array before map is
called. It does get converted to an array through the normal behavior of
#map:

irb(main):003:0> h={1=>2, 3=>4}
=> {1=>2, 3=>4}
irb(main):004:0> h.map
=> [[1, 2], [3, 4]]
 
J

Justin Collins

Joe said:
collect seems to work on a hash:

h = {'a'=>'1', 'b'=>'2'}

params = h.collect {|k, v| "#{k}=#{v}"}.join('&')

Yet collect isn't listed as a method of hash:
http://www.ruby-doc.org/core

Is it undocumented, or is some magic going on behind the scenes -- such
as the hash getting converted to an array?

Thanks,
Joe

No, no real magic: "collect" is part of the Enumerable module, which is
mixed into Hash (and other things) and implements this functionality.

-Justin

[1]http://ruby-doc.org/core/classes/Enumerable.html
 
M

matt neuburg

Joe Ruby MUDCRAP-CE said:
collect seems to work on a hash:

You might find something like the following exploratory utility useful:

def method_report(klass)
result = klass.ancestors.inject(Array.new) do |result, anc|
ms = (anc.instance_methods + anc.methods).sort.uniq
result.last[1] -= ms if result.last
result << [anc.name, ms]
end
result.each do |k, v|
puts "----", k
v.each {|m| puts "\s\s#{m}"}
end
end
# and here's how to use it
method_report(Hash)

I'm sure there are much snazzier versions out there. m.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,216
Messages
2,571,118
Members
47,720
Latest member
mohdkaif002

Latest Threads

Top