> Named arguments
yes, though it's basically an optional argument hash. AFAIK, you can't do required named arguments without weird hacks, or specifically checking the arguments. For example:
irb(main):007:0> def foo(bar: bar, baz: Object.new); [bar, baz]; end
=> nil
irb(main):008:0> foo(bar: 1)
=> [1, #<Object:0x007fcaa40db4e0>]
irb(main):009:0> foo(baz: 1)
NameError: undefined local variable or method `bar' for main:Object
from (irb):7:in `foo'
from (irb):9
from /Users/aaron/.local/bin/irb:12:in `<main>'
irb(main):010:0>
This hack makes the "bar" parameter required, but only because the value is evaluated when the method is called, and you get a NameError (rather than an ArgumentError).
> Selector namepaces
yes, but it's called refinements. You can see how they're used here: https://github.com/ruby/ruby/blob/trunk/test/ruby/test_refin... (sorry for the link to a test, I'm feeling lazy ;-) )
> Multiple inheritance
Sorry, there won't be multiple inheritance.
> Incremental performance improvements over 1.9's VM
yes, ko1 has been working on removing / optimizing bytecodes in the VM.
> Better compatibility with non-unix environments and small/constrained devices (embeddable)
I don't know of any work on this other than mruby, which isn't MRI.
> Sandboxed VM's (VM per thread)
nope. https://bugs.ruby-lang.org/issues/7003
Other stuff:
* DTrace probes
* Better within ruby tracing https://bugs.ruby-lang.org/issues/6895
I run edge ruby against rails daily. The main incompatibilities I've hit in Ruby 2.0 are what methods respond_to? searches (I've blogged about that here: http://tenderlovemaking.com/2012/09/07/protected-methods-and... ), and the `Config` constant has been removed (which is sometimes an issue for C extensions).
EDIT
Just thought of this for the required args:
irb(main):001:0> def foo(bar: (raise ArgumentError), foo: Object.new); [bar, foo]; end
=> nil
irb(main):002:0> foo(bar: 1)
=> [1, #<Object:0x007fc65a882f48>]
irb(main):003:0> foo(foo: 1)
ArgumentError: ArgumentError
from (irb):1:in `foo'
from (irb):3
from /Users/aaron/.local/bin/irb:12:in `<main>'
irb(main):004:0>
You could probably define a private method like `required` or some such, like this:
irb(main):001:0> def required(name); raise ArgumentError, "missing param: %s" % name; end
=> nil
irb(main):002:0> def foo(bar: required(:bar), foo: Object.new); [bar, foo]; end
=> nil
irb(main):003:0> foo(bar: 1)
=> [1, #<Object:0x007fcfea143338>]
irb(main):004:0> foo(foo: 1)
ArgumentError: missing param: bar
from (irb):1:in `required'
from (irb):2:in `foo'
from (irb):4
from /Users/aaron/.local/bin/irb:12:in `<main>'
irb(main):005:0>