mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
implement Hash.[]
This commit is contained in:
@@ -3,6 +3,39 @@ class Hash
|
||||
# ISO does not define Hash#each_pair, so each_pair is defined in gem.
|
||||
alias each_pair each
|
||||
|
||||
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} at #{__LINE__} (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
|
||||
t = (0...(object.length >> 1)).map { |i| i * 2 }
|
||||
for i in t do
|
||||
h[object[i]] = object[i + 1]
|
||||
end
|
||||
h
|
||||
end
|
||||
|
||||
##
|
||||
# call-seq:
|
||||
# hsh.merge!(other_hash) -> hsh
|
||||
|
||||
@@ -1,6 +1,44 @@
|
||||
##
|
||||
# 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' }
|
||||
|
||||
Reference in New Issue
Block a user