93 lines
5.6 KiB
HTML
93 lines
5.6 KiB
HTML
<html><head>
|
||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||
<param name="Keyword" value="Срез">
|
||
<param name="Keyword" value="Безопасный срез">
|
||
</object>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||
<title></title>
|
||
<link rel="StyleSheet" href="../../default.css">
|
||
</head>
|
||
<body><H1>Срезы</H1>
|
||
<p>Срез - это набор элементов динамического массива, списка List<T> или строки,
|
||
расположенных последовательно либо с некоторым шагом. </p>
|
||
<p>Срез имеет вид:</p>
|
||
<blockquote>
|
||
<code>a[from:to]</code>
|
||
</blockquote>
|
||
<p>или</p>
|
||
<blockquote>
|
||
<code>a[from:to:step]</code>
|
||
</blockquote>
|
||
<p>или</p>
|
||
<blockquote>
|
||
<code>a?[from:to]</code>
|
||
</blockquote>
|
||
<p>или</p>
|
||
<blockquote>
|
||
<code>a?[from:to:step]</code>
|
||
</blockquote>
|
||
<p>и содержит копию элементов исходного контейнера в диапазоне [<code>from</code>,
|
||
<code>to</code>) с
|
||
шагом <code>step</code>. Запись [<code>from</code>,
|
||
<code>to</code>) означает, что элемент с индексом
|
||
<code>from</code> включается в
|
||
диапазон, а элемент с индексом <code>to</code> - не включается.
|
||
Значения <code>from</code>,
|
||
<code>to</code>, <code>step</code>
|
||
должны быть целыми.</p>
|
||
<p>Если <code>step</code> не указывается, то предполагается, что
|
||
<code>step</code>=1, т.е. элементы
|
||
расположены непрерывно.</p>
|
||
<p>Тип среза совпадает с типом контейнера: срез элементов массива представляет
|
||
собой массив, срез строки - строку и срез для List<T> также принадлежит к типу
|
||
List<T>.</p>
|
||
<p>Для обычных срезов исключение генерируется в следующих случаях. Если индекс <code>from</code> выходит за границы, то во
|
||
время выполнения программы возникает исключение. Индекс
|
||
<code>to</code> может выходить за границы на 1, т.е.
|
||
находиться в диапазоне [-1..a.Count] для динамических массивов и списков List<T>
|
||
и в диапазоне [0..s.Length+1] для строк, в противном случае также возникает
|
||
исключение. </p>
|
||
<p>Если <code>step</code>=0, то для всех видов срезов генерируется исключение.</p>
|
||
<p>Срезы вида
|
||
<code>a?</code>
|
||
называются <i>безопасными срезами</i> и во всех остальных случаях не генерируют
|
||
исключений. Они работают следующим образом. Вначале контейнер считается
|
||
бесконечным в обе стороны и срез выбирает в нём определённые элементы. После
|
||
этого в срезе оставляются только те элементы, которые принадлежат исходному
|
||
контейнеру.</p>
|
||
<p>Приведём ряд примеров:</p>
|
||
<blockquote>
|
||
<p><code><b>var</b> a array of integer := [0,1,2,3,4,5,6];<br>Println(a[2:5]); // [2,3,4]<br>
|
||
Println(a[2:a.Length]); // [2,3,4,5,6]<br>Println(a[2:1000]); // Исключение!<br>Println(a?[2:1000]);
|
||
// [2,3,4,5,6]<br>Println(a[2:7:2]); // [2,4,6]<br>
|
||
Println(a[2:0]); // пустой массив<br><b>var</b> s := '0123456';<br>
|
||
Println(s[2:5]); // 123<br>Println(s[0:2]); // Исключение!<br>Println(s?[0:2]);
|
||
// 12<br>Println(s?[-2::2]); // 135<br>Println(s[2:s.Length]); // 12345</code></p>
|
||
</blockquote>
|
||
<p>Шаг <code>step</code> может быть отрицательным. Например:</p>
|
||
<blockquote>
|
||
<p><code><b>var</b> a := Arr(0,1,2,3,4,5,6);<br>Println(a[5:2:-1]); //
|
||
[5,4,3]<br>Println(a[2:5:-1]); // пустой массив<br>
|
||
Println(a[a.Length-1:-1:-2]); // [6,4,2,0]</code></p>
|
||
</blockquote>
|
||
<p>В записи среза выражение <code>from</code> или выражение
|
||
<code>to</code> могут быть пропущены, в этом случае в срез
|
||
попадают все элементы с соответствующей стороны. Если <code>
|
||
step</code>>0, то пропущенный <code>from</code> полагается
|
||
равным индексу первого элемента, пропущенный <code>to</code>
|
||
полагается равным индексу последнего элемента + 1. Если
|
||
<code>step</code><0, то пропущенный
|
||
<code>from</code> полагается равным индексу последнего
|
||
элемента, а пропущенный <code>to</code> - индексу первого
|
||
элемента - 1. </p><p>Например:</p>
|
||
<blockquote>
|
||
<p><code><b>var</b> s := '0123456';<br>Println(s[2:]); // 23456<br>
|
||
Println(s[:4]); // 012<br>Println(s[::-1]); // 6543210</code></p>
|
||
</blockquote>
|
||
<p>Родственным к срезам является метод Slice, определенный для динамических
|
||
массивов, списков List<T>, строк и последовательностей. Однако, смысл параметров
|
||
у него - другой: a.Slice(from,step,count).</p>
|
||
<p><br>
|
||
</p>
|
||
|
||
</body></html> |