summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS.md8
-rw-r--r--array.c21
-rw-r--r--enumerator.c3
3 files changed, 27 insertions, 5 deletions
diff --git a/NEWS.md b/NEWS.md
index d88642b71c..447788b932 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -149,6 +149,14 @@ Outstanding ones only.
* Array#uniq
* Array#*
+ * Can be sliced with Enumerator::ArithmeticSequence
+
+ ```ruby
+ dirty_data = ['--', 'data1', '--', 'data2', '--', 'data3']
+ dirty_data[(1..).step(2)] # take each second element
+ # => ["data1", "data2", "data3"]
+ ```
+
* ConditionVariable
* ConditionVariable#wait may now invoke the `block`/`unblock` scheduler
diff --git a/array.c b/array.c
index f4c3e27af7..ea84473fdf 100644
--- a/array.c
+++ b/array.c
@@ -1775,11 +1775,22 @@ static VALUE rb_ary_aref2(VALUE ary, VALUE b, VALUE e);
* a[4..0] # => nil
* a[4..-1] # => nil
*
- * When a single argument +aseq+ is given,
- * ...(to be described)
- *
- * Raises an exception if given a single argument
- * that is not an \Integer-convertible object or a \Range object:
+ * When a single Enumerator::ArithmeticSequence argument +aseq+ is given,
+ * returns an Array of elements corresponding to the indexes produced by
+ * the sequence.
+ * a = ['--', 'data1', '--', 'data2', '--', 'data3']
+ * a[(1..).step(2)] # => ["data1", "data2", "data3"]
+ *
+ * Unlike slicing with range, if the start or the end of the arithmetic sequence
+ * is larger than array size, throws RangeError.
+ * a = ['--', 'data1', '--', 'data2', '--', 'data3']
+ * a[(1..11).step(2)]
+ * # RangeError (((1..11).step(2)) out of range)
+ * a[(7..).step(2)]
+ * # RangeError (((7..).step(2)) out of range)
+ *
+ * If given a single argument, and its type is not one of the listed, tries to
+ * convert it to Integer, and raises if it is impossible:
* a = [:foo, 'bar', 2]
* # Raises TypeError (no implicit conversion of Symbol into Integer):
* a[:foo]
diff --git a/enumerator.c b/enumerator.c
index 68cfc2bcf7..fe5f054c74 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -3333,6 +3333,9 @@ enumerator_plus(VALUE obj, VALUE eobj)
* that is a representation of sequences of numbers with common difference.
* Instances of this class can be generated by the Range#step and Numeric#step
* methods.
+ *
+ * The class can be used for slicing Array (see Array#slice) or custom
+ * collections.
*/
VALUE