to_hash/to_a check in Hash[] should only be done when only one argument is given; ref #2594

parent 02b2ac8d
...@@ -24,32 +24,37 @@ class Hash ...@@ -24,32 +24,37 @@ class Hash
# #
def self.[](*object) def self.[](*object)
o = object[0] length = object.length
if o.respond_to?(:to_hash) if length == 1
h = Hash.new o = object[0]
object[0].to_hash.each { |k, v| h[k] = v } if o.respond_to?(:to_hash)
return h h = Hash.new
elsif o.respond_to?(:to_a) object[0].to_hash.each { |k, v| h[k] = v }
h = Hash.new return h
o.to_a.each do |i| elsif o.respond_to?(:to_a)
raise ArgumentError, "wrong element type #{i.class} (expected array)" unless i.respond_to?(:to_a) h = Hash.new
k, v = nil o.to_a.each do |i|
case i.size raise ArgumentError, "wrong element type #{i.class} (expected array)" unless i.respond_to?(:to_a)
when 2 k, v = nil
k = i[0] case i.size
v = i[1] when 2
when 1 k = i[0]
k = i[0] v = i[1]
else when 1
raise ArgumentError, "invalid number of elements (#{i.size} for 1..2)" k = i[0]
else
raise ArgumentError, "invalid number of elements (#{i.size} for 1..2)"
end
h[k] = v
end end
h[k] = v return h
end end
return h
end end
raise ArgumentError, 'odd number of arguments for Hash' unless object.length % 2 == 0 unless length % 2 == 0
raise ArgumentError, 'odd number of arguments for Hash'
end
h = Hash.new h = Hash.new
0.step(object.length - 2, 2) do |i| 0.step(length - 2, 2) do |i|
h[object[i]] = object[i + 1] h[object[i]] = object[i + 1]
end end
h h
......
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