mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* array.c: Have to_h raise on elements that are not key-value pairs [#9239]
* enum.c: ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44354 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
573762a7b7
commit
9471f4187f
5 changed files with 47 additions and 19 deletions
|
|
@ -1,3 +1,10 @@
|
||||||
|
Mon Dec 23 12:42:13 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
|
||||||
|
|
||||||
|
* array.c: Have to_h raise on elements that are not key-value pairs
|
||||||
|
[#9239]
|
||||||
|
|
||||||
|
* enum.c: ditto
|
||||||
|
|
||||||
Mon Dec 23 05:01:55 2013 Zachary Scott <e@zzak.io>
|
Mon Dec 23 05:01:55 2013 Zachary Scott <e@zzak.io>
|
||||||
|
|
||||||
* doc/syntax/methods.rdoc: [DOC] Added example for underscore
|
* doc/syntax/methods.rdoc: [DOC] Added example for underscore
|
||||||
|
|
|
||||||
13
array.c
13
array.c
|
|
@ -2130,8 +2130,7 @@ rb_ary_to_a(VALUE ary)
|
||||||
* ary.to_h -> hash
|
* ary.to_h -> hash
|
||||||
*
|
*
|
||||||
* Returns the result of interpreting <i>ary</i> as an array of
|
* Returns the result of interpreting <i>ary</i> as an array of
|
||||||
* <tt>[key, value]</tt> pairs. Elements other than pairs of
|
* <tt>[key, value]</tt> pairs.
|
||||||
* values are ignored.
|
|
||||||
*
|
*
|
||||||
* [[:foo, :bar], [1, 2]].to_h
|
* [[:foo, :bar], [1, 2]].to_h
|
||||||
* # => {:foo => :bar, 1 => 2}
|
* # => {:foo => :bar, 1 => 2}
|
||||||
|
|
@ -2144,9 +2143,15 @@ rb_ary_to_h(VALUE ary)
|
||||||
VALUE hash = rb_hash_new();
|
VALUE hash = rb_hash_new();
|
||||||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||||||
VALUE key_value_pair = rb_check_array_type(rb_ary_elt(ary, i));
|
VALUE key_value_pair = rb_check_array_type(rb_ary_elt(ary, i));
|
||||||
if (!NIL_P(key_value_pair) && (RARRAY_LEN(key_value_pair) == 2)) {
|
if (NIL_P(key_value_pair)) {
|
||||||
rb_hash_aset(hash, RARRAY_AREF(key_value_pair, 0), RARRAY_AREF(key_value_pair, 1));
|
rb_raise(rb_eTypeError, "wrong element type %s at %ld (expected array)",
|
||||||
|
rb_builtin_class_name(rb_ary_elt(ary, i)), i);
|
||||||
}
|
}
|
||||||
|
if (RARRAY_LEN(key_value_pair) != 2) {
|
||||||
|
rb_raise(rb_eArgError, "wrong array length at %ld (expected 2, was %ld)",
|
||||||
|
i, RARRAY_LEN(key_value_pair));
|
||||||
|
}
|
||||||
|
rb_hash_aset(hash, RARRAY_AREF(key_value_pair, 0), RARRAY_AREF(key_value_pair, 1));
|
||||||
}
|
}
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
enum.c
16
enum.c
|
|
@ -512,12 +512,19 @@ enum_to_a(int argc, VALUE *argv, VALUE obj)
|
||||||
static VALUE
|
static VALUE
|
||||||
enum_to_h_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash))
|
enum_to_h_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash))
|
||||||
{
|
{
|
||||||
|
VALUE key_value_pair;
|
||||||
ENUM_WANT_SVALUE();
|
ENUM_WANT_SVALUE();
|
||||||
rb_thread_check_ints();
|
rb_thread_check_ints();
|
||||||
i = rb_check_array_type(i);
|
key_value_pair = rb_check_array_type(i);
|
||||||
if (!NIL_P(i) && RARRAY_LEN(i) == 2) {
|
if (NIL_P(key_value_pair)) {
|
||||||
rb_hash_aset(hash, RARRAY_AREF(i, 0), RARRAY_AREF(i, 1));
|
rb_raise(rb_eTypeError, "wrong element type %s (expected array)",
|
||||||
|
rb_builtin_class_name(i));
|
||||||
}
|
}
|
||||||
|
if (RARRAY_LEN(key_value_pair) != 2) {
|
||||||
|
rb_raise(rb_eArgError, "element has wrong array length (expected 2, was %ld)",
|
||||||
|
RARRAY_LEN(key_value_pair));
|
||||||
|
}
|
||||||
|
rb_hash_aset(hash, RARRAY_AREF(key_value_pair, 0), RARRAY_AREF(key_value_pair, 1));
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -526,8 +533,7 @@ enum_to_h_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, hash))
|
||||||
* enum.to_h(*args) -> hash
|
* enum.to_h(*args) -> hash
|
||||||
*
|
*
|
||||||
* Returns the result of interpreting <i>enum</i> as a list of
|
* Returns the result of interpreting <i>enum</i> as a list of
|
||||||
* <tt>[key, value]</tt> pairs. Elements other than pairs of
|
* <tt>[key, value]</tt> pairs.
|
||||||
* values are ignored.
|
|
||||||
*
|
*
|
||||||
* %i[hello world].each_with_index.to_h
|
* %i[hello world].each_with_index.to_h
|
||||||
* # => {:hello => 0, :world => 1}
|
* # => {:hello => 0, :world => 1}
|
||||||
|
|
|
||||||
|
|
@ -1467,12 +1467,18 @@ class TestArray < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
array = [
|
array = [
|
||||||
[:key, :value],
|
[:key, :value],
|
||||||
[:ignore_me],
|
|
||||||
[:ignore, :me, :too],
|
|
||||||
:ignore_me,
|
|
||||||
kvp,
|
kvp,
|
||||||
]
|
]
|
||||||
assert_equal({key: :value, obtained: :via_to_ary}, array.to_h)
|
assert_equal({key: :value, obtained: :via_to_ary}, array.to_h)
|
||||||
|
|
||||||
|
e = assert_raise(TypeError) {
|
||||||
|
[[:first_one, :ok], :not_ok].to_h
|
||||||
|
}
|
||||||
|
assert_equal "wrong element type Symbol at 1 (expected array)", e.message
|
||||||
|
e = assert_raise(ArgumentError) {
|
||||||
|
[[:first_one, :ok], [1, 2], [:not_ok]].to_h
|
||||||
|
}
|
||||||
|
assert_equal "wrong array length at 2 (expected 2, was 1)", e.message
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_uniq
|
def test_uniq
|
||||||
|
|
|
||||||
|
|
@ -104,17 +104,11 @@ class TestEnumerable < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_to_h
|
def test_to_h
|
||||||
assert_equal({}, @obj.to_h)
|
|
||||||
obj = Object.new
|
obj = Object.new
|
||||||
def obj.each(*args)
|
def obj.each(*args)
|
||||||
yield args
|
yield *args
|
||||||
yield [:key, :value]
|
yield [:key, :value]
|
||||||
yield [:ignore_me]
|
|
||||||
yield [:ignore, :me, :too]
|
|
||||||
yield :other_key, :other_value
|
yield :other_key, :other_value
|
||||||
yield :ignore_me
|
|
||||||
yield :ignore, :me, :too
|
|
||||||
yield
|
|
||||||
kvp = Object.new
|
kvp = Object.new
|
||||||
def kvp.to_ary
|
def kvp.to_ary
|
||||||
[:obtained, :via_to_ary]
|
[:obtained, :via_to_ary]
|
||||||
|
|
@ -128,6 +122,16 @@ class TestEnumerable < Test::Unit::TestCase
|
||||||
:other_key => :other_value,
|
:other_key => :other_value,
|
||||||
:obtained => :via_to_ary,
|
:obtained => :via_to_ary,
|
||||||
}, obj.to_h(:hello, :world))
|
}, obj.to_h(:hello, :world))
|
||||||
|
|
||||||
|
e = assert_raise(TypeError) {
|
||||||
|
obj.to_h(:not_an_array)
|
||||||
|
}
|
||||||
|
assert_equal "wrong element type Symbol (expected array)", e.message
|
||||||
|
|
||||||
|
e = assert_raise(ArgumentError) {
|
||||||
|
obj.to_h([1])
|
||||||
|
}
|
||||||
|
assert_equal "element has wrong array length (expected 2, was 1)", e.message
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_inject
|
def test_inject
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue