4 ms·
> Named arguments yes, though it's basically an optional argument hash. AFAIK, you can't do required named arguments without weird hacks, or specifically chec
by tenderlove 14y ago
> 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_refinement.rb 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 https://bugs.ruby-lang.org/issues/7003
Other stuff:
* DTrace probes
* Better within ruby tracing https://bugs.ruby-lang.org/issues/6895 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-ruby-2-0.html 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>
- InclinedPlane 14y ago> > Multiple inheritance > Sorry, there won't be multiple inheritance. Thank all that is holy in the world.
- deleted 14y ago[deleted]
- angersock 14y agoAmen to that. C++ pretty much ruined that party for everyone.
- riffraff 14y agoanother nice vm improvement would be the introduction of unboxed floats in 64 bit architectures (akin to Fixnums) https://github.com/ruby/ruby/commit/b3b5e626ad69bf22be3228f847f94e1b68f40888 https://github.com/ruby/ruby/commit/b3b5e626ad69bf22be3228f8...
- lloeki 14y agoSo it's syntactic sugar? What a shame. The whole point is having the language handle it so its default behavior is well-known and uniform and not implement umpteenth patterns and validations[0]. [0] e.g assert_valid_keys (raising ArgumentError on a mismatch so it's really only for options={} pattern: http://api.rubyonrails.org/classes/Hash.html#method-i-assert_valid_keys http://api.rubyonrails.org/classes/Hash.html#method-i-assert...
- tenderlove 14y agoWell, it does actually define locals. But, IIRC, it uses the symbol hash parsing productions, so the default values are required. The only way to specify required parameters (without the above hacks) is to do a traditional method definition: irb(main):001:0> def foo(bar, baz: Object.new); [bar, baz]; end => nil irb(main):002:0> foo(1) => [1, #<Object:0x007fbc39161ed8>] irb(main):003:0> foo(1, baz: 10) => [1, 10] irb(main):004:0> foo(baz: 10) ArgumentError: wrong number of arguments (0 for 1) from (irb):1:in `foo' from (irb):4 from /Users/aaron/.local/bin/irb:12:in `<main>' irb(main):005:0>