Beim Holen und Setzen von Informationen unter Verwendung von Time-State lassen sich komplexere Schlüssel verwenden als einfache Symbole wie :foo
und :bar
. Du kannst auch Zeichenketten in der Art von URLs verwenden, wie z.B. "/foo/bar/baz"
. Sobald wir anfangen mit Pfaden zu arbeiten, können wir auch die Vorteile des ausgeklügelten Muster-Abgleich-Systems von Sonic Pi nutzen, um get
und sync
mit ‘ähnlichen’ und nicht mit ‘identischen’ Pfaden zu synchronisieren. Lass uns einen Blick darauf werfen.
Lass uns annehmen wir möchten auf das nächste Ereignis warten, das die folgenden drei Pfad-Segmente enthält:
sync "/*/*/*"
Dieses Muster wird zu jedem Time-State-Ereignis passen, das aus exakt drei Pfadsegmenten besteht, unabhängig von deren Namen. Zum Beispiel:
cue "/foo/bar/baz"
cue "/foo/baz/quux"
cue "/eggs/beans/toast"
cue "/moog/synths/rule"
Allerdings wird es nicht zu Ereignissen mit wenigeren oder mehr Pfad-Segmente passen. Die folgenden würden nicht passen:
cue "/foo/bar"
cue "/foo/baz/quux/quaax"
cue "/eggs"
Jeder *
bedeutet jeder Inhalt. Das bedeutet, wir können Pfade mit nur einem Segment mit /*
oder Pfade aus fünf Segmenten mit /*/*/*/*/*
abgleichen
Wenn wir wissen, womit das Segment beginnen oder enden wird, können wir ein *
zusätzlich zum Namen eines Teilsegments verwenden. Zum Beispiel: "/foo/b*/baz"
passt zu jedem Pfad, der drei Segmente hat, von denen das erste foo
, das letzte baz
und das mittlere Segment alles sein kann, was mit b
beginnt. Also, es würde passen zu:
cue "/foo/bar/baz"
cue "/foo/baz/baz"
cue "/foo/beans/baz"
Allerdings würde es nicht zu Folgendem passen:
cue "/foo/flibble/baz"
cue "/foo/abaz/baz"
cue "/foo/beans/baz/eggs"
Du kannst das *
auch an den Anfang des Segments setzen, um die letzten Zeichen eines Segments anzugeben: "/foo/*zz/baz"
, wird zu jedem cue
or set
bestehend aus 3 Segmenten passen, wo das erste Segment foo
, das letzte baz
ist und das mittlere Segment auf zz
endet, so wie "cue "/foo/whizz/baz"
.
Manchmal weißt du nicht, wie viele Pfadsegmente du abgleichen möchtest. In diesen Fällen kannst du den mächtigen Doppelstern **
verwenden, wie in "/foo/**/**/baz"
, das übereinstimmt mit:
cue "/foo/bar/baz"
cue "/foo/bar/beans/baz"
cue "/foo/baz"
cue "/foo/a/b/c/d/e/f/baz"
Du kannst das ?
verwenden, um mit einem beliebigen einzelnen Zeichen abzugleichen. "/?oo/bar/baz"
passt zu:
cue "/foo/bar/baz"
cue "/goo/bar/baz"
cue "/too/bar/baz"
cue "/woo/bar/baz"
Wenn du weißt, das ein Segment eines aus einer bestimmten Reihe von Wörtern ist, kannst du eine Auswahlliste zwischen {
und }
setzen, so wie "/foo/{bar,beans,eggs}/quux"
, was nur auf das Folgende passt:
cue "/foo/bar/quux"
cue "/foo/beans/quux"
cue "/foo/eggs/quux"
Schließlich kannst du auch noch gegen eine Auswahl von Buchstaben abgleichen, indem du eine Auswahlliste zwischen {
und }
setzt, so wie "/foo/[abc]ux/baz"
, was nur passen wird zu:
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
Du kannst mit -
auch Buchstabenbereiche angeben. Zum Beispiel "/foo/[a-e]ux/baz"
, was nur passt zu:
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
cue "/foo/dux/baz"
cue "/foo/eux/baz"
Wenn du sync
oder get
aufrufst, kannst du Abgleiche mit Mustern in beliebiger Reihenfolge miteinander kombinieren, um sehr effektiv jedes beliebige Time-State-Ereignis, das durch cue
oder set
erzeugt wurde, zu erkennen. Lass uns ein verrücktes Beispiel anschauen:
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/"
For those curious, these matching rules are based on the Open Sound Control pattern matching specification which is explained in detail here: https://opensoundcontrol.stanford.edu/spec-1_0.html