data Event = HoldKey Char | PressKey Char | Err String
someFunc = let
someEvent <- doSomeStuff
-- What follows is a case expression using pattern matching
thingINeed <- case someEvent of
HoldKey keySym -> process keySym
PressKey keySym -> process keySym
Err err -> exit err
in keepDoingStuff
在Raku中最接近这个的东西似乎是多例程(既包括函数也包括方法)。
class Hold { has $.key; }
class Press { has $.key; }
class Err { has $.msg; }
multi process(Hold (:$key)) { say $key; }
multi process(Press (:$key)) { say $key; }
multi process(Err (:$msg)) { say $msg; }
但是如果我想要一个“本地”的模式匹配表达式(就像上面的Haskell片段中的case
表达式一样),这并没有帮助。类似如下:
given Hold.new(:key<a>) {
when Hold (:$key) { say $key }
when Press (:$key) { say $key }
when Err (:$msg) { say $msg }
default { say "Unsupported" }
}
可惜这段代码无法编译。那我是漏掉了什么,还是 Raku 有其他的表达方式?
given
表达式,它并不真正支持完整的模式匹配。 - Dincio