Issue #9049 has been updated by david_macmahon (David MacMahon).


I like the compactness of the a:b notation.  My preference would be for it to be a Range shorthand, but I think that would conflict with the {a:b} Hash syntax (especially when passing a Hash as the last argument to a method).

Another thing that would be useful (and probably belongs in a different feature request) is a NumericRange class that supports a "step_size" attribute in addition to "first" and "last" attributes.  Maybe NumericRange is too specific a name since it is possible for non-numeric types to support the "step_size" concept (e.g. Date) so maybe "RangeWithStepSize" would be more appropriate (though too long!).  Then we could dream about Matlab-like syntax `(1:2:5).to_a => [1, 3, 5]`.  Maybe just enhance Range to have an explicit step_size that can be something other than the implicit default of 1 (and 0)?


----------------------------------------
Feature #9049: Shorthands (a:b, *) for inclusive indexing
https://bugs.ruby-lang.org/issues/9049#change-42590

Author: mohawkjohn (John Woods)
Status: Open
Priority: Low
Assignee: 
Category: core
Target version: 


=begin
For NMatrix, we've implemented a range shorthand which relies on Hashes: (({m[1=>3,2=>4]})), for example, which returns rows 1 through 3 inclusive of columns 2 through 4 (also inclusive). The original goal was to be able to do (({m[1:3,2:4]})) using the new hash notation, but the new hash notation requires that the key be a symbol ??? it won't accept an integer.

Whether through the hash interface or not, it'd be lovely if there were a shorthand for slicing matrices (and even Ruby Arrays) using colon. This could just be an alternate syntax for ranges, also ??? which might make more sense.

The other related shorthand we'd love to find a way to implement is the all-inclusive shorthand. It gets to be a pain to type (({n[0...n.shape[0],1...3]})) to get a submatrix (a slice), and it's really difficult to read. As a work-around, we currently use the (({:*})) symbol: (({n[:*,1...3]})). But it'd be simpler if there were a way to use a splat operator without an operand as a function argument. It might be a special case where the (({*})) is treated as a (({:*})) automatically. But this edge case might cause confusion with error messages when users make syntax errors elsewhere.

The colon shorthand is the highest priority for us.
=end



-- 
http://bugs.ruby-lang.org/