Команда ReQL: slice, []
Синтаксис команды
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
Описание
Возвращает элементы последовательности в указанном диапазоне.
slice возвращает диапазон между start_offset и end_offset. Если указан только start_offset, slice возвращает диапазон от этого индекса до конца последовательности. Укажите left_bound или right_bound в качестве open или closed , чтобы указать, нужно ли включать этот край диапазона по умолчанию: closed возвращает этот край, а open — нет. По умолчанию left_bound закрыт, а right_bound открыт, поэтому диапазон (10,13) вернёт десятый, одиннадцатый и двенадцатый элементы в последовательности.
Если end_offset выходит за пределы последовательности, будут возвращены все элементы от start_offset до конца последовательности. Если start_offset выходит за пределы последовательности или end_offset меньше start_offset, будет возвращена последовательность нулевой длины.
Допускаются отрицательные значения start_offset и end_offset для массивов; в этом случае возвращаемый диапазон отсчитывается от конца массива. То есть, диапазон (-2) возвращает два последних элемента, а диапазон (2,-1) возвращает второй элемент до предпоследнего элемента диапазона. При отрицательном start_offset или end_offset с не-массивами будет выброшено исключение. (Отрицательное значение end_offset — 1 разрешено для потока, если right_bound закрыт; это ведет себя так, как если бы end_offset не было указано.)
Если slice используется с объектом binary, индексы ссылаются на байтовые позиции в объекте. То есть, диапазон (10,20) будет относиться к 10-му байту до 19-го байта.
С строкой slice ведет себя аналогично, при этом индексы относятся к кодовым точкам Юникода. Индексы строк начинаются с 0. (Обратите внимание, что комбинирующие кодовые точки учитываются отдельно.)
Если вы указываете только индексы, а не параметры границ, вы можете использовать оператор диапазона Ruby в качестве сокращения: [start_offset..end_offset]. Обратите внимание, что при использовании этого сокращения right_bound будет closed, и, следовательно, будет включать end_offset.
Пример: Возвращает четвёртого, пятого и шестого самых молодых игроков. (Самый молодой игрок имеет индекс 0, поэтому это элементы 3–5.)
r.table('players').order_by(:index => 'age').slice(3,6).run(conn)
Или, используя оператор диапазона Ruby:
r.table('players').filter({'class': 'amateur'})[10..19].run(conn)
Пример: Возвращает всех игроков, кроме трёх лучших, у которых красный флаг.
r.table('players').filter(:flag => 'red'}).order_by(:index => r.desc('score')).slice(3).run(conn)
Пример: Возвращает держателей билетов X по Y, предполагая, что билеты пронумерованы последовательно. Мы хотим включить билет Y.
r.table('users').order_by(:index => 'ticket').slice(x, y, :right_bound => 'closed').run(conn)
Пример: Возвращает элементы массива со второго по предпоследний (то есть, не включая два последних).
> r.expr([0,1,2,3,4,5]).slice(2,-2).run(conn)
[2,3]
Пример: Возвращает третьи по пятый символы строки.
> 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/