При получении и установке информации в Time State можно использовать более сложные ключи, чем основные символы, такие как : foo
и: bar
. Вы также можете использовать строки в стиле URL, которые называются пути (paths), например " / foo / bar / baz "
. Как только мы начнем работать с путями, мы сможем воспользоваться преимуществами реализованной в Sonic Pi сложной системы сопоставления паттернов для того, чтобы пользоваться функциями get
и sync
с похожими, а не с полностью идентичными путями. Давайте взглянем на это.
Предположим, что мы хотим дождаться следующего события, которое имеет три сегмента пути:
sync "/*/*/*"
Это будет сопоставимо с любым событием Time State с тремя сегментами пути, независимо от их имен. Например:
cue "/foo/bar/baz"
cue "/foo/baz/quux"
cue "/eggs/beans/toast"
cue "/moog/synths/rule"
Однако он * не будет * сопоставляться с путями с меньшим или большим количеством сегментов. Следующие пути не будут сопоставляться:
cue "/foo/bar"
cue "/foo/baz/quux/quaax"
cue "/eggs"
Каждый символ *
означает * любой контент *. Таким образом, мы можем сопоставлять между собой пути с одним сегментом с / *
или пути с пятью сегментами с / * / * / * / * / *
Если мы знаем, с чего начинается или заканчивается сегмент, мы можем использовать *
в дополнение к частичному имени сегмента. Например: " / foo / b * / baz "
будет соответствовать любому пути, который имеет три сегмента, первый из которых foo
, последний baz
, а средний сегмент может быть любым, начинающимся с b
. Таким образом, с этим будут сопоставимы следующие пути:
cue "/foo/bar/baz"
cue "/foo/baz/baz"
cue "/foo/beans/baz"
Однако, не будут сопоставимы следующие пути:
cue "/foo/flibble/baz"
cue "/foo/abaz/baz"
cue "/foo/beans/baz/eggs"
Вы также можете поместить *
в начале сегмента, чтобы указать последние символы сегмента: " / foo / * zz / baz "
, который будет соответствовать любым 3 сегментам cue
или set
, где первый сегмент - foo
, последний - baz
, а средний сегмент заканчивается zz
, например "cue" / foo / whizz / baz "
.
Иногда вы не знаете, сколько сегментов пути вы хотите сопоставить. В этих случаях вы можете использовать возможности двойной звезды: **
, например " / foo / ** / baz "
. Тогда это будет сопоставимо с:
cue "/foo/bar/baz"
cue "/foo/bar/beans/baz"
cue "/foo/baz"
cue "/foo/a/b/c/d/e/f/baz"
Вы можете использовать символ ?
для сопоставления с одним символом. Например " /? оo / bar / baz "
, что будет сопоставимо с:
cue "/foo/bar/baz"
cue "/goo/bar/baz"
cue "/too/bar/baz"
cue "/woo/bar/baz"
Если вы знаете, что сегмент может быть представлен словом из заданного набора, вы можете использовать сопоставители {
и }
, чтобы указать список вариантов. Например `” / foo / {bar, beans, eggs} / quux “, что может быть сопоставлено только со следующим:
cue "/foo/bar/quux"
cue "/foo/beans/quux"
cue "/foo/eggs/quux"
Наконец, вы можете сопоставить сегмент из набора букв, если используете сопоставители [
и ]
, чтобы указать список вариантов. Например путь " / foo / [abc] ux / baz "
будет сопоставим только с:
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
Вы также можете использовать символ -
для указания диапазонов букв. Например, " / foo / [a-e] ux / baz "
будет сопоставим только с:
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
cue "/foo/dux/baz"
cue "/foo/eux/baz"
При вызове sync
или get
вы можете комбинировать сопоставители в любом порядке, который вы считаете подходящим для сопоставления любому событию Time State, заданному с помощью cue
или set
. Давайте рассмотрим потрясающий пример:
in_thread do
sync "/?oo/[a-z]*/**/ba*/{quux,quaax}/"
sample :loop_amen
end
sleep 1
cue "/foo/beans/a/b/c/d/e/bark/quux/"
Для тех, кому интересно, эти правила сопоставления основаны на спецификации сопоставления паттернов протокола Open Sound Control. Подробности описаны здесь: http://opensoundcontrol.org/spec-1_0