Commit 02b2ac8d authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2594 from yasuyuki/hash

Implement Hash[]
parents e4bd48f3 5f16c417
......@@ -3,6 +3,58 @@ class Hash
# ISO does not define Hash#each_pair, so each_pair is defined in gem.
alias each_pair each
##
# call-seq:
# Hash[ key, value, ... ] -> new_hash
# Hash[ [ [key, value], ... ] ] -> new_hash
# Hash[ object ] -> new_hash
#
# Creates a new hash populated with the given objects.
#
# Similar to the literal <code>{ _key_ => _value_, ... }</code>. In the first
# form, keys and values occur in pairs, so there must be an even number of
# arguments.
#
# The second and third form take a single argument which is either an array
# of key-value pairs or an object convertible to a hash.
#
# Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
# Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200}
# Hash["a" => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
#
def self.[](*object)
o = object[0]
if o.respond_to?(:to_hash)
h = Hash.new
object[0].to_hash.each { |k, v| h[k] = v }
return h
elsif o.respond_to?(:to_a)
h = Hash.new
o.to_a.each do |i|
raise ArgumentError, "wrong element type #{i.class} (expected array)" unless i.respond_to?(:to_a)
k, v = nil
case i.size
when 2
k = i[0]
v = i[1]
when 1
k = i[0]
else
raise ArgumentError, "invalid number of elements (#{i.size} for 1..2)"
end
h[k] = v
end
return h
end
raise ArgumentError, 'odd number of arguments for Hash' unless object.length % 2 == 0
h = Hash.new
0.step(object.length - 2, 2) do |i|
h[object[i]] = object[i + 1]
end
h
end
##
# call-seq:
# hsh.merge!(other_hash) -> hsh
......
##
# Hash(Ext) Test
assert('Hash.[] Hash') do
a = Hash['a_key' => 'a_value']
assert_equal({'a_key' => 'a_value'}, a)
end
assert('Hash.[] [ [ ["b_key", "b_value" ] ] ]') do
a = Hash[ [ ['b_key', 'b_value'] ] ]
assert_equal({'b_key' => 'b_value'}, a)
a = Hash[ [ ] ]
assert_equal({}, a)
assert_raise(ArgumentError) do
Hash[ [ ['b_key', 'b_value', 'b_over'] ] ]
end
assert_raise(ArgumentError) do
Hash[ [ [] ] ]
end
end
assert('Hash.[] "c_key", "c_value"') do
a = Hash['c_key', 'c_value', 'd_key', 1]
assert_equal({'c_key' => 'c_value', 'd_key' => 1}, a)
a = Hash[]
assert_equal({}, a)
assert_raise(ArgumentError) do
Hash['d_key']
end
end
assert('Hash#merge!') do
a = { 'abc_key' => 'abc_value', 'cba_key' => 'cba_value' }
b = { 'cba_key' => 'XXX', 'xyz_key' => 'xyz_value' }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment