It is possible to catch any value of a sub-pattern by matching it against an identifier:
var myTree = Node(Leaf("foo"), Node(Leaf("bar"), Leaf("foobar"))); var name = switch (myTree) { case Leaf(s): s; case Node(Leaf(s), _): s; case _: "none"; } trace(name); // foo
This would return one of the following:
myTree is a Leaf, its name is returned.myTree is a Node whose left sub-tree is a Leaf, its name is returned (this will apply here, returning "foo")."none" is returned.It is also possible to use = to capture values which are further matched:
var myTree = Node(Leaf("foo"), Node(Leaf("bar"), Leaf("foobar"))); var node = switch (myTree) { case Node(leafNode = Leaf("foo"), _): leafNode; case x: x; } trace(node); // Leaf(foo)
Here, leafNode is bound to Leaf("foo") if the input matches that. In all other cases, myTree itself is returned: case x works similar to case _ in that it matches anything, but with an identifier name like x it also binds the matched value to that variable.
If the compiler detects that the name of a "catch-all" variable is very similar to an enum constructor, it will warn about a potential typo. This can be avoided by prefixing the variable identifier with var:
var myTree = Node(Leaf("foo"), Node(Leaf("bar"), Leaf("foobar"))); switch (myTree) { case Leaf(_): // ... case var node: // without var above the compiler would warn about a potential typo // node contains the entire matched tree }
Any capture variable can be prefixed with var, even within sub-patterns.