mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
The combination of non-Symbol keys and Symbol keys is now allowed again
Revert r64358. [Bug #15658] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67217 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
bda6df356a
commit
76fc1ce0a7
5 changed files with 55 additions and 140 deletions
7
NEWS
7
NEWS
|
@ -22,6 +22,9 @@ sufficient information, see the ChangeLog file or Redmine
|
|||
|
||||
* lambda with no block in a method called with a block errs.
|
||||
|
||||
* Non-Symbol keys in a keyword arguments hash was prohibited at 2.6.0, but
|
||||
now allowed again. [Bug #15658]
|
||||
|
||||
=== Core classes updates (outstanding ones only)
|
||||
|
||||
Enumerable::
|
||||
|
@ -59,10 +62,6 @@ RSS::
|
|||
|
||||
=== Stdlib compatibility issues (excluding feature bug fixes)
|
||||
|
||||
profile.rb, Profiler__::
|
||||
|
||||
* Removed from standard library. No one maintains it from Ruby 2.0.0.
|
||||
|
||||
=== C API updates
|
||||
|
||||
=== Implementation improvements
|
||||
|
|
44
class.c
44
class.c
|
@ -1824,57 +1824,33 @@ unknown_keyword_error(VALUE hash, const ID *table, int keywords)
|
|||
rb_keyword_error("unknown", rb_hash_keys(hash));
|
||||
}
|
||||
|
||||
struct extract_keywords {
|
||||
VALUE kwdhash, nonsymkey;
|
||||
};
|
||||
|
||||
static int
|
||||
separate_symbol(st_data_t key, st_data_t value, st_data_t arg)
|
||||
{
|
||||
struct extract_keywords *argp = (struct extract_keywords *)arg;
|
||||
VALUE k = (VALUE)key, v = (VALUE)value;
|
||||
|
||||
if (argp->kwdhash) {
|
||||
if (UNLIKELY(!SYMBOL_P(k))) {
|
||||
argp->nonsymkey = k;
|
||||
return ST_STOP;
|
||||
}
|
||||
}
|
||||
else if (SYMBOL_P(k)) {
|
||||
if (UNLIKELY(argp->nonsymkey != Qundef)) {
|
||||
argp->kwdhash = Qnil;
|
||||
return ST_STOP;
|
||||
}
|
||||
argp->kwdhash = rb_hash_new();
|
||||
}
|
||||
else {
|
||||
if (argp->nonsymkey == Qundef)
|
||||
argp->nonsymkey = k;
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
rb_hash_aset(argp->kwdhash, k, v);
|
||||
VALUE *kwdhash = (VALUE *)arg;
|
||||
if (!SYMBOL_P(key)) kwdhash++;
|
||||
if (!*kwdhash) *kwdhash = rb_hash_new();
|
||||
rb_hash_aset(*kwdhash, (VALUE)key, (VALUE)value);
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_extract_keywords(VALUE *orighash)
|
||||
{
|
||||
struct extract_keywords arg = {0, Qundef};
|
||||
VALUE parthash[2] = {0, 0};
|
||||
VALUE hash = *orighash;
|
||||
|
||||
if (RHASH_EMPTY_P(hash)) {
|
||||
*orighash = 0;
|
||||
return hash;
|
||||
}
|
||||
rb_hash_foreach(hash, separate_symbol, (st_data_t)&arg);
|
||||
if (arg.kwdhash) {
|
||||
if (arg.nonsymkey != Qundef) {
|
||||
rb_raise(rb_eArgError, "non-symbol key in keyword arguments: %+"PRIsVALUE,
|
||||
arg.nonsymkey);
|
||||
rb_hash_foreach(hash, separate_symbol, (st_data_t)&parthash);
|
||||
*orighash = parthash[1];
|
||||
if (parthash[1] && RBASIC_CLASS(hash) != rb_cHash) {
|
||||
RBASIC_SET_CLASS(parthash[1], RBASIC_CLASS(hash));
|
||||
}
|
||||
*orighash = 0;
|
||||
}
|
||||
return arg.kwdhash;
|
||||
return parthash[0];
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -49,7 +49,20 @@ describe "A block yielded a single" do
|
|||
result.should == [1, 2, [], 3, 2, {x: 9}]
|
||||
end
|
||||
|
||||
it "calls #to_hash on the argument" do
|
||||
it "assigns symbol keys from a Hash to keyword arguments" do
|
||||
result = m(["a" => 1, a: 10]) { |a=nil, **b| [a, b] }
|
||||
result.should == [{"a" => 1}, a: 10]
|
||||
end
|
||||
|
||||
it "assigns symbol keys from a Hash returned by #to_hash to keyword arguments" do
|
||||
obj = mock("coerce block keyword arguments")
|
||||
obj.should_receive(:to_hash).and_return({"a" => 1, b: 2})
|
||||
|
||||
result = m([obj]) { |a=nil, **b| [a, b] }
|
||||
result.should == [{"a" => 1}, b: 2]
|
||||
end
|
||||
|
||||
it "calls #to_hash on the argument but does not use the result when no keywords are present" do
|
||||
obj = mock("coerce block keyword arguments")
|
||||
obj.should_receive(:to_hash).and_return({"a" => 1, "b" => 2})
|
||||
|
||||
|
@ -58,20 +71,12 @@ describe "A block yielded a single" do
|
|||
end
|
||||
|
||||
describe "when non-symbol keys are in a keyword arguments Hash" do
|
||||
ruby_version_is ""..."2.6" do
|
||||
it "separates non-symbol keys and symbol keys" do
|
||||
result = m(["a" => 10, b: 2]) { |a=nil, **b| [a, b] }
|
||||
result.should == [{"a" => 10}, {b: 2}]
|
||||
end
|
||||
end
|
||||
|
||||
ruby_version_is "2.6" do
|
||||
it "raises an ArgumentError" do
|
||||
lambda {m(["a" => 1, a: 10]) { |a=nil, **b| [a, b] }}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "does not treat hashes with string keys as keyword arguments" do
|
||||
result = m(["a" => 10]) { |a = nil, **b| [a, b] }
|
||||
result.should == [{"a" => 10}, {}]
|
||||
|
|
|
@ -849,13 +849,8 @@ describe "A method" do
|
|||
|
||||
m(b: 2).should == [1, 2]
|
||||
m(2, b: 1).should == [2, 1]
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, b: 2).should == [{"a" => 1}, 2]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, b: 2)}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
|
||||
evaluate <<-ruby do
|
||||
def m(a=1, b: 2) [a, b] end
|
||||
|
@ -864,13 +859,8 @@ describe "A method" do
|
|||
m().should == [1, 2]
|
||||
m(2).should == [2, 2]
|
||||
m(b: 3).should == [1, 3]
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, b: 2).should == [{"a" => 1}, 2]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, b: 2)}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
|
||||
evaluate <<-ruby do
|
||||
def m(a=1, **) a end
|
||||
|
@ -878,13 +868,8 @@ describe "A method" do
|
|||
|
||||
m().should == 1
|
||||
m(2, a: 1, b: 0).should == 2
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, a: 2).should == {"a" => 1}
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, a: 2)}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
|
||||
evaluate <<-ruby do
|
||||
def m(a=1, **k) [a, k] end
|
||||
|
@ -929,13 +914,8 @@ describe "A method" do
|
|||
|
||||
m(a: 1).should == 1
|
||||
m(1, 2, a: 3).should == 3
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, a: 2).should == 2
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, a: 2)}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
|
||||
evaluate <<-ruby do
|
||||
def m(*a, b:) [a, b] end
|
||||
|
@ -943,13 +923,8 @@ describe "A method" do
|
|||
|
||||
m(b: 1).should == [[], 1]
|
||||
m(1, 2, b: 3).should == [[1, 2], 3]
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, b: 2).should == [[{"a" => 1}], 2]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, b: 2)}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
|
||||
evaluate <<-ruby do
|
||||
def m(*, a: 1) a end
|
||||
|
@ -959,13 +934,8 @@ describe "A method" do
|
|||
m(1, 2).should == 1
|
||||
m(a: 2).should == 2
|
||||
m(1, a: 2).should == 2
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, a: 2).should == 2
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, a: 2)}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
|
||||
evaluate <<-ruby do
|
||||
def m(*a, b: 1) [a, b] end
|
||||
|
@ -973,12 +943,7 @@ describe "A method" do
|
|||
|
||||
m().should == [[], 1]
|
||||
m(1, 2, 3, b: 4).should == [[1, 2, 3], 4]
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, b: 2).should == [[{"a" => 1}], 2]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, b: 2)}.should raise_error(ArgumentError)
|
||||
end
|
||||
|
||||
a = mock("splat")
|
||||
a.should_not_receive(:to_ary)
|
||||
|
@ -1009,12 +974,7 @@ describe "A method" do
|
|||
|
||||
m().should == []
|
||||
m(1, 2, 3, a: 4, b: 5).should == [1, 2, 3]
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, a: 1).should == [{"a" => 1}]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, a: 1)}.should raise_error(ArgumentError)
|
||||
end
|
||||
m(1, **{a: 2}).should == [1]
|
||||
|
||||
h = mock("keyword splat")
|
||||
|
@ -1028,12 +988,7 @@ describe "A method" do
|
|||
|
||||
m().should == {}
|
||||
m(1, 2, 3, a: 4, b: 5).should == {a: 4, b: 5}
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, a: 1).should == {a: 1}
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, a: 1)}.should raise_error(ArgumentError)
|
||||
end
|
||||
|
||||
h = mock("keyword splat")
|
||||
h.should_receive(:to_hash).and_return({a: 1})
|
||||
|
@ -1047,22 +1002,12 @@ describe "A method" do
|
|||
m().should == [nil, {}]
|
||||
m("a" => 1).should == [{"a" => 1}, {}]
|
||||
m(a: 1).should == [nil, {a: 1}]
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, a: 1).should == [{"a" => 1}, {a: 1}]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, a: 1)}.should raise_error(ArgumentError)
|
||||
end
|
||||
m({ "a" => 1 }, a: 1).should == [{"a" => 1}, {a: 1}]
|
||||
m({a: 1}, {}).should == [{a: 1}, {}]
|
||||
|
||||
h = {"a" => 1, b: 2}
|
||||
ruby_version_is ""..."2.6" do
|
||||
m(h).should == [{"a" => 1}, {b: 2}]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m(h)}.should raise_error(ArgumentError)
|
||||
end
|
||||
h.should == {"a" => 1, b: 2}
|
||||
|
||||
h = {"a" => 1}
|
||||
|
@ -1082,13 +1027,8 @@ describe "A method" do
|
|||
|
||||
h = mock("keyword splat")
|
||||
h.should_receive(:to_hash).and_return({"a" => 1, a: 2})
|
||||
ruby_version_is ""..."2.6" do
|
||||
m(h).should == [{"a" => 1}, {a: 2}]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m(h)}.should raise_error(ArgumentError)
|
||||
end
|
||||
end
|
||||
|
||||
evaluate <<-ruby do
|
||||
def m(*a, **k) [a, k] end
|
||||
|
@ -1101,12 +1041,7 @@ describe "A method" do
|
|||
|
||||
m("a" => 1).should == [[{"a" => 1}], {}]
|
||||
m(a: 1).should == [[], {a: 1}]
|
||||
ruby_version_is ""..."2.6" do
|
||||
m("a" => 1, a: 1).should == [[{"a" => 1}], {a: 1}]
|
||||
end
|
||||
ruby_version_is "2.6" do
|
||||
lambda {m("a" => 1, a: 1)}.should raise_error(ArgumentError)
|
||||
end
|
||||
m({ "a" => 1 }, a: 1).should == [[{"a" => 1}], {a: 1}]
|
||||
m({a: 1}, {}).should == [[{a: 1}], {}]
|
||||
m({a: 1}, {"a" => 1}).should == [[{a: 1}, {"a" => 1}], {}]
|
||||
|
|
|
@ -102,7 +102,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([0, nil, {b: 1}], Bug::ScanArgs.opt_hash(b: 1))
|
||||
assert_equal([1, "a", {b: 1}], Bug::ScanArgs.opt_hash("a", b: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.opt_hash("a", "b")}
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.opt_hash("a"=>0, b: 1)}
|
||||
assert_equal([1, {"a"=>0}, {b: 1}], Bug::ScanArgs.opt_hash("a"=>0, b: 1))
|
||||
end
|
||||
|
||||
def test_lead_opt_hash
|
||||
|
@ -112,7 +112,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([2, "a", "b", {c: 1}], Bug::ScanArgs.lead_opt_hash("a", "b", c: 1))
|
||||
assert_equal([1, {c: 1}, nil, nil], Bug::ScanArgs.lead_opt_hash(c: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_opt_hash("a", "b", "c")}
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_opt_hash("a", "b"=>0, c: 1)}
|
||||
assert_equal([2, "a", {"b"=>0}, {c: 1}], Bug::ScanArgs.lead_opt_hash("a", "b"=>0, c: 1))
|
||||
end
|
||||
|
||||
def test_var_hash
|
||||
|
@ -120,7 +120,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([1, ["a"], nil], Bug::ScanArgs.var_hash("a"))
|
||||
assert_equal([1, ["a"], {b: 1}], Bug::ScanArgs.var_hash("a", b: 1))
|
||||
assert_equal([0, [], {b: 1}], Bug::ScanArgs.var_hash(b: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.var_hash("a"=>0, b: 1)}
|
||||
assert_equal([1, [{"a"=>0}], {b: 1}], Bug::ScanArgs.var_hash("a"=>0, b: 1))
|
||||
end
|
||||
|
||||
def test_lead_var_hash
|
||||
|
@ -131,7 +131,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([1, "a", [], {c: 1}], Bug::ScanArgs.lead_var_hash("a", c: 1))
|
||||
assert_equal([1, {c: 1}, [], nil], Bug::ScanArgs.lead_var_hash(c: 1))
|
||||
assert_equal([3, "a", ["b", "c"], nil], Bug::ScanArgs.lead_var_hash("a", "b", "c"))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_var_hash("a", "b"=>0, c: 1)}
|
||||
assert_equal([2, "a", [{"b"=>0}], {c: 1}], Bug::ScanArgs.lead_var_hash("a", "b"=>0, c: 1))
|
||||
end
|
||||
|
||||
def test_opt_var_hash
|
||||
|
@ -142,7 +142,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([1, "a", [], {c: 1}], Bug::ScanArgs.opt_var_hash("a", c: 1))
|
||||
assert_equal([0, nil, [], {c: 1}], Bug::ScanArgs.opt_var_hash(c: 1))
|
||||
assert_equal([3, "a", ["b", "c"], nil], Bug::ScanArgs.opt_var_hash("a", "b", "c"))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.opt_var_hash("a", "b"=>0, c: 1)}
|
||||
assert_equal([2, "a", [{"b"=>0}], {c: 1}], Bug::ScanArgs.opt_var_hash("a", "b"=>0, c: 1))
|
||||
end
|
||||
|
||||
def test_lead_opt_var_hash
|
||||
|
@ -154,7 +154,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([1, {c: 1}, nil, [], nil], Bug::ScanArgs.lead_opt_var_hash(c: 1))
|
||||
assert_equal([3, "a", "b", ["c"], nil], Bug::ScanArgs.lead_opt_var_hash("a", "b", "c"))
|
||||
assert_equal([3, "a", "b", ["c"], {d: 1}], Bug::ScanArgs.lead_opt_var_hash("a", "b", "c", d: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_opt_var_hash("a", "b", "c"=>0, d: 1)}
|
||||
assert_equal([3, "a", "b", [{"c"=>0}], {d: 1}], Bug::ScanArgs.lead_opt_var_hash("a", "b", "c"=>0, d: 1))
|
||||
end
|
||||
|
||||
def test_opt_trail_hash
|
||||
|
@ -165,7 +165,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([2, "a", "b", {c: 1}], Bug::ScanArgs.opt_trail_hash("a", "b", c: 1))
|
||||
assert_equal([1, nil, {c: 1}, nil], Bug::ScanArgs.opt_trail_hash(c: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.opt_trail_hash("a", "b", "c")}
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.opt_trail_hash("a", "b"=>0, c: 1)}
|
||||
assert_equal([2, "a", {"b"=>0}, {c: 1}], Bug::ScanArgs.opt_trail_hash("a", "b"=>0, c: 1))
|
||||
end
|
||||
|
||||
def test_lead_opt_trail_hash
|
||||
|
@ -178,7 +178,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([3, "a", "b", "c", nil], Bug::ScanArgs.lead_opt_trail_hash("a", "b", "c"))
|
||||
assert_equal([3, "a", "b", "c", {c: 1}], Bug::ScanArgs.lead_opt_trail_hash("a", "b", "c", c: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_opt_trail_hash("a", "b", "c", "d")}
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_opt_trail_hash("a", "b", "c"=>0, c: 1)}
|
||||
assert_equal([3, "a", "b", {"c"=>0}, {c: 1}], Bug::ScanArgs.lead_opt_trail_hash("a", "b", "c"=>0, c: 1))
|
||||
end
|
||||
|
||||
def test_var_trail_hash
|
||||
|
@ -190,7 +190,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([1, [], {c: 1}, nil], Bug::ScanArgs.var_trail_hash(c: 1))
|
||||
assert_equal([3, ["a", "b"], "c", nil], Bug::ScanArgs.var_trail_hash("a", "b", "c"))
|
||||
assert_equal([3, ["a", "b"], "c", {c: 1}], Bug::ScanArgs.var_trail_hash("a", "b", "c", c: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.var_trail_hash("a", "b", "c"=>0, c: 1)}
|
||||
assert_equal([3, ["a", "b"], {"c"=>0}, {c: 1}], Bug::ScanArgs.var_trail_hash("a", "b", "c"=>0, c: 1))
|
||||
end
|
||||
|
||||
def test_lead_var_trail_hash
|
||||
|
@ -202,7 +202,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([2, "a", [], "b", {c: 1}], Bug::ScanArgs.lead_var_trail_hash("a", "b", c: 1))
|
||||
assert_equal([3, "a", ["b"], "c", nil], Bug::ScanArgs.lead_var_trail_hash("a", "b", "c"))
|
||||
assert_equal([3, "a", ["b"], "c", {c: 1}], Bug::ScanArgs.lead_var_trail_hash("a", "b", "c", c: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_var_trail_hash("a", "b", c: 1, "c"=>0)}
|
||||
assert_equal([3, "a", ["b"], {"c"=>0}, {c: 1}], Bug::ScanArgs.lead_var_trail_hash("a", "b", c: 1, "c"=>0))
|
||||
end
|
||||
|
||||
def test_opt_var_trail_hash
|
||||
|
@ -214,7 +214,7 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([2, "a", [], "b", {c: 1}], Bug::ScanArgs.opt_var_trail_hash("a", "b", c: 1))
|
||||
assert_equal([3, "a", ["b"], "c", nil], Bug::ScanArgs.opt_var_trail_hash("a", "b", "c"))
|
||||
assert_equal([3, "a", ["b"], "c", {c: 1}], Bug::ScanArgs.opt_var_trail_hash("a", "b", "c", c: 1))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.opt_var_trail_hash("a", "b", "c"=>0, c: 1)}
|
||||
assert_equal([3, "a", ["b"], {"c"=>0}, {c: 1}], Bug::ScanArgs.opt_var_trail_hash("a", "b", "c"=>0, c: 1))
|
||||
end
|
||||
|
||||
def test_lead_opt_var_trail_hash
|
||||
|
@ -226,6 +226,6 @@ class TestScanArgs < Test::Unit::TestCase
|
|||
assert_equal([3, "a", "b", [], "c", nil], Bug::ScanArgs.lead_opt_var_trail_hash("a", "b", "c"))
|
||||
assert_equal([3, "a", "b", [], "c", {c: 1}], Bug::ScanArgs.lead_opt_var_trail_hash("a", "b", "c", c: 1))
|
||||
assert_equal([4, "a", "b", ["c"], "d", nil], Bug::ScanArgs.lead_opt_var_trail_hash("a", "b", "c", "d"))
|
||||
assert_raise(ArgumentError) {Bug::ScanArgs.lead_opt_var_trail_hash("a", "b", "c", "d"=>0, c: 1)}
|
||||
assert_equal([4, "a", "b", ["c"], {"d"=>0}, {c: 1}], Bug::ScanArgs.lead_opt_var_trail_hash("a", "b", "c", "d"=>0, c: 1))
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue