Статьи

Ссылки, массивы и хеши

Ссылки
Если Вы поместите символ @ перед именем строковой переменной, её значение будет использоваться как имя другой переменной или метода. Например:
var=”Name”;
x = @var; // присваивает x значение переменной Name
mymethod=”Show”;
@mymethod(); // вызывает метод Show

Это имеет множество применений, хотя, если это делать часто, можно повредить мозг. Например, можно использовать @ для симуляции ‘неограниченных’ массивов. Допустим, name – переменная, содержащая строку “x1”, тогда использование @name эквивалентно непосредственному использованию x1. Таким образом:
i = 10;
name = “x” & i;
@name = 0;

присваивает переменной x10 значение 0. Две последние строчки эквивалентны x[i] = 0; в языке C. Это часто применяется; однако, Вы также захотите рассмотреть применение встроенных массивов (и хеш-таблиц), описанных ниже.

Массивы и хеши
Описанный выше метод, который использует ‘поддельные’ массивы, немного сложноват на практике. Но ManuScript также обеспечивает встроенные объекты-массивы. Для создания массива используется встроенный метод CreateArray():
array = CreateArray();
Элементы массива могут быть установлены или прочитаны используя [] индексный оператор массива. Заметьте, что Вам не нужно определять размер массива, он сам расширится до нужного размера при добавлении в него новых элементов. Все переменные-массивы имеют связанные с ними переменные-члены с именем NumChildren, которые содержат текущий размер массива. Это видно на простом примере.
array = CreateArray();
array[0] = ”one”;
array[1] = ”two”;
array[2] = ”three”;
for x = 0 to array.NumChildren {
   Sibelius.MessageBox(array[x]);
}

К несчастью, эти встроенные массивы могут хранить только числа и строки (но не объекты), так что приходится всё же использовать ‘поддельные’ массивы, обсуждаемые выше, всякий раз, когда мы захотим создать массив, скажем, Нот. Тем не менее, встроенные массивы намного удобнее, если нужно хранить только строки или числа.
Сходное массиву понятие – хеш-таблица. Здесь мы храним значения в таблице, чтобы их можно было индексировать ‘ключевой строкой’ (а не просто числом, как в массивах). Это бывает полезно всякий раз, когда мы хотим связать значения с определёнными ‘ключами’. Для создания хеш-таблицы в ManuScript просто используется встроенная функция CreateHash() таким же образом, как мы использовали CreateArray() выше. Доступ к элементам можно получить, используя оператор [ ], как и раньше. Вот пример:
table = CreateHash();
table[”key one”] = ”first value”;
table[”key two”] = ”second value”;
table[”key three”] = ”third value”;
Sibelius.MessageBox(table[”key one”]);

Это напечатает “first value” в окне сообщения. Если делается попытка получить доступ к элементу массива или хеша по индексу, в данный момент не ассоциированному со значением (например, table[”key four”] из предыдущего фрагмента), возвращается специальное значение null.
Массивы и хеши – это объекты, а не строки, и поэтому не могут быть напечатаны, показаны в окне сообщения и т.д. Однако, если Вы захотите использовать значение массива или хеша как строку, можете использовать метод WriteToString(), например,
all_array = arrayname.WriteToString().