ReQL command: slice, []

Command syntax

selection.slice(start_offset[, end_offset, :left_bound => 'closed', :right_bound =>'open']) → selection
stream.slice(start_offset[, end_offset, :left_bound => 'closed', :right_bound =>'open']) → stream
array.slice(start_offset[, end_offset, :left_bound => 'closed', :right_bound =>'open']) → array
binary.slice(start_offset[, end_offset, :left_bound => 'closed', :right_bound =>'open']) → binary
string.slice(start_offset[, end_offset, :left_bound => 'closed', :right_bound =>'open']) → string

Description

Return the elements of a sequence within the specified range.

slice returns the range between start_offset and end_offset. If only start_offset is specified, slice returns the range from that index to the end of the sequence. Specify left_bound or right_bound as open or closed to indicate whether to include that endpoint of the range by default: closed returns that endpoint, while open does not. By default, left_bound is closed and right_bound is open, so the range (10,13) will return the tenth, eleventh and twelfth elements in the sequence.

If end_offset is past the end of the sequence, all elements from start_offset to the end of the sequence will be returned. If start_offset is past the end of the sequence or end_offset is less than start_offset, a zero-element sequence will be returned.

Negative start_offset and end_offset values are allowed with arrays; in that case, the returned range counts back from the array’s end. That is, the range (-2) returns the last two elements, and the range of (2,-1) returns the second element through the next-to-last element of the range. An error will be raised on a negative start_offset or end_offset with non-arrays. (An end_offset of −1 is allowed with a stream if right_bound is closed; this behaves as if no end_offset was specified.)

If slice is used with a binary object, the indexes refer to byte positions within the object. That is, the range (10,20) will refer to the 10th byte through the 19th byte.

With a string, slice behaves similarly, with the indexes referring to Unicode codepoints. String indexes start at 0. (Note that combining codepoints are counted separately.)

If you are only specifying the indexes and not the bounding options, you may use Ruby’s range operator as a shorthand: [start_offset..end_offset]. Note that when you use this shorthand right_bound will be closed and thus include end_offset.

Example: Return the fourth, fifth and sixth youngest players. (The youngest player is at index 0, so those are elements 3–5.)

r.table('players').order_by(:index => 'age').slice(3,6).run(conn)

Or, using Ruby’s range operator:

r.table('players').filter({'class': 'amateur'})[10..19].run(conn)

Example: Return all but the top three players who have a red flag.

r.table('players').filter(:flag => 'red'}).order_by(:index => r.desc('score')).slice(3).run(conn)

Example: Return holders of tickets X through Y, assuming tickets are numbered sequentially. We want to include ticket Y.

r.table('users').order_by(:index => 'ticket').slice(x, y, :right_bound => 'closed').run(conn)

Example: Return the elements of an array from the second through two from the end (that is, not including the last two).

> r.expr([0,1,2,3,4,5]).slice(2,-2).run(conn)
[2,3]

Example: Return the third through fifth characters of a string.

> r.expr("rutabaga").slice(2,5).run(conn)
"tab"

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/slice/