mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
+20
-3
@@ -891,14 +891,31 @@ mrb_ary_rindex_m(mrb_state *mrb, mrb_value self)
|
||||
MRB_API mrb_value
|
||||
mrb_ary_splat(mrb_state *mrb, mrb_value v)
|
||||
{
|
||||
mrb_value a, recv_class;
|
||||
|
||||
if (mrb_array_p(v)) {
|
||||
return v;
|
||||
}
|
||||
if (mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
|
||||
return mrb_funcall(mrb, v, "to_a", 0);
|
||||
|
||||
if (!mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
|
||||
return mrb_ary_new_from_values(mrb, 1, &v);
|
||||
}
|
||||
|
||||
a = mrb_funcall(mrb, v, "to_a", 0);
|
||||
if (mrb_array_p(a)) {
|
||||
return a;
|
||||
}
|
||||
else if (mrb_nil_p(a)) {
|
||||
return mrb_ary_new_from_values(mrb, 1, &v);
|
||||
}
|
||||
else {
|
||||
return mrb_ary_new_from_values(mrb, 1, &v);
|
||||
recv_class = mrb_obj_value(mrb_obj_class(mrb, v));
|
||||
mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Array (%S#to_a gives %S)",
|
||||
recv_class,
|
||||
recv_class,
|
||||
mrb_obj_value(mrb_obj_class(mrb, a))
|
||||
);
|
||||
return mrb_undef_value();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -307,6 +307,36 @@ assert('Return values of no expression case statement') do
|
||||
assert_equal 1, when_value
|
||||
end
|
||||
|
||||
assert('splat object in assignment') do
|
||||
o = Object.new
|
||||
def o.to_a
|
||||
nil
|
||||
end
|
||||
assert_equal [o], (a = *o)
|
||||
|
||||
def o.to_a
|
||||
1
|
||||
end
|
||||
assert_raise(TypeError) { a = *o }
|
||||
|
||||
def o.to_a
|
||||
[2]
|
||||
end
|
||||
assert_equal [2], (a = *o)
|
||||
end
|
||||
|
||||
assert('splat object in case statement') do
|
||||
o = Object.new
|
||||
def o.to_a
|
||||
nil
|
||||
end
|
||||
a = case o
|
||||
when *o
|
||||
1
|
||||
end
|
||||
assert_equal 1, a
|
||||
end
|
||||
|
||||
assert('splat in case statement') do
|
||||
values = [3,5,1,7,8]
|
||||
testa = [1,2,7]
|
||||
|
||||
Reference in New Issue
Block a user