From: "97jaz (Jon Zeppieri)" Date: 2013-10-09T14:03:29+09:00 Subject: [ruby-core:57761] [ruby-trunk - misc #8993] Request for clarification on method argument binding for keyword arguments Issue #8993 has been updated by 97jaz (Jon Zeppieri). I don't believe that's true. In the above example, f:5 is not being used as a keyword argument. It's being bound to e, the mandatory formal that comes after the optional ones. What JRuby's interpreter does now is what #8040 says it should do (at, least, so far as I understand #8040). For any argument to be considered a keyword argument, the number of arguments provided to a method needs to be greater than the number of mandatory arguments. In the example above, the method accepts three mandatory arguments, and the call provides three, so none of them are treated as keyword arguments. MRI, on the other hand, does treat f:5 as a keyword argument. ---------------------------------------- misc #8993: Request for clarification on method argument binding for keyword arguments https://bugs.ruby-lang.org/issues/8993#change-42362 Author: 97jaz (Jon Zeppieri) Status: Open Priority: Normal Assignee: Category: core Target version: =begin I recently fixed keyword arguments in the JRuby interpreter, and I then found an example for which MRI and JRuby have different behavior: def foo(a, b, c=1, *d, e, f:2, **g) [a, b, c, d, e, f, g] end foo(1, 2, f:5) MRI raises: ArgumentError: wrong number of arguments (2 for 3+) ... whereas JRuby produces: [1, 2, 1, [], {:f=>5}, 2, {}] I implemented the behavior in JRuby to conform with MRI, but in this case, I think that JRuby's behavior is correct, based upon the discussion in #8040. Is there a spec for this feature somewhere (aside from the RSpec specs that I submitted to the RubySpec project)? In #7529, Matz refers to "the spec" for this feature, but I don't know where or what that is. =end -- http://bugs.ruby-lang.org/