查看此example:
(let [x 1 y 2]
(match [x y]
[1 b] b
[a 2] a
:else nil))
;=> 2
我无法理解一些事情:
1
是否匹配x
并绑定到b
?2
是否匹配y
并绑定到a
?a
的一部分匹配,为什么返回b
而不是[x y]
。是因为这是最后一个子句吗?答案 0 :(得分:4)
将每个模式都视为要与输入[x y]
或[1 2]
匹配的模板。
第一个模式是[1 b]
,它与输入匹配,因为第一个模板项是匹配的文字值1
,第二个模板项是将保留的 binding 输入的该位置中的 any 值,在这种情况下恰好是2
。可以从match子句的右侧访问b
绑定,就好像它是let
绑定一样。
此示例可能会更清楚地演示它:
(let [x 1 y 2]
(match [x y]
[1 b] [1 (inc b)] ;; recreate the input with (inc b)
[a 2] a ;; this never matches because prior match works
:else nil))
=> [1 3]
2
是否匹配y
并绑定到a
?
该模式是一个匹配项,但是没关系,因为前面的模式已经是一个匹配项。如果匹配成功,则a
将绑定到1
。