It seems that as of the latest head from today:
jruby 9000.dev-SNAPSHOT (2.1.2p142) 2014-09-02 8771d02 Java HotSpot™
64-Bit Server VM 24.0-b56 on 1.7.0_40-b43 [darwin-x86_64]
The following 2.1 syntax is not implemented?
ArgumentError: wrong number of arguments (3 for 2)
initialize at /…/file.rb:11
Where that line is:
def initialize(name, context,**opts)
am I missing something to make that happen in the current codebase? or
is
this a well know feature that still has to be implemented?
If the latter is true: do you have any inkling as to when that could be
done?
Can you give a more complete example. This works for me:
class Foo
def initialize(name, context,**opts)
p opts
end
end
Foo.new(1, 2, a: 1)
./bin/jruby -v snippets/kw15.rb
jruby 9000.dev-SNAPSHOT (2.1.2p142) 2014-09-02 8771d02 Java HotSpot™
64-Bit Server VM 24.60-b09 on 1.7.0_60-b19 [darwin-x86_64]
/Users/enebo/work/jruby/lib/ruby/shared/rubygems/defaults/jruby.rb:92
warning: Ambiguous first argument; make sure.
/Users/enebo/work/jruby/lib/ruby/shared/rubygems/defaults/jruby.rb:96
warning: shadowing outer local variable - dir
{:a=>1}
Aha! intersting…yes I can…so it seems a consequence of the “super”
method.
Here you have a repro:
class Foo
def initialize(name, context,**opts)
p opts
end
end
class Bar < Foo
def initialize(name, context, path: nil)
super
end
end
Bar.new(1, 2)
Bar.new(1,2, path: “there”)
bug:foo $ rvm 2.1
bug:foo $ ruby /tmp/x.rb
{:path=>nil}
{:path=>“there”}
bug:foo $ rvm jruby-head
bug:foo $ ruby /tmp/x.rb
ArgumentError: wrong number of arguments (3 for 2)
initialize at /tmp/x.rb:9
initialize at /tmp/x.rb:9
(root) at /tmp/x.rb:13
while in MRI ruby both calls work (with and without the hash), in jruby
both fail with the arguments error.
So, something about the super call doesn’t quite work as MRI does.
So, we have just open sourced a lean API framework ( Unveiling Praxis | RightScale Engineering Blog) and it is
very
much built using ruby 2.1 constructs, and I was trying to see if I could
run some simple apps using jruby-head. In that process I’m finding
incompatibilities (like the initial one about the super kwargs).
Patching that manually got me forward, but here’s the next one I found
(and
this time I’ve directly opened an issue):
in essence:
ruby-head :005 > Pathname.new(“/tmp/foo”).find
LocalJumpError: yield called out of block
from
/Users/blanquer/.rvm/rubies/jruby-head/lib/ruby/2.1/pathname.rb:1002:in find' from /Users/blanquer/.rvm/rubies/jruby-head/lib/ruby/2.1/find.rb:47:in find’