有些時(shí)候,需要對(duì)定義的模式做某些限制,比如你需要完成表達(dá)式簡(jiǎn)化,比如兩個(gè)相同的參數(shù)相加 e+e ,你想把它簡(jiǎn)化為 e*2。也就是
BinOp("+",Var("x"),Var("x"))
轉(zhuǎn)化為
BinOp("\*",Var("x"),Number(2))
你可能試著這么定義規(guī)則:
def simplifyAdd(e:Expr) =e match{
case BinOp("+",x,x) => BinOp("*",x,Number(2))
case _ =>
}
但是編譯器會(huì)報(bào)錯(cuò):
<console>:13: error: x is already defined as value x
case BinOp("+",x,x) => BinOp("*",x,Number(2))
告訴你變量 x 已經(jīng)定義過了,也是模式中定義的變量名只能定義一次,那么此時(shí)就可以借助于限制修飾,我們重新定義如下:
def simplifyAdd(e:Expr) =e match{
case BinOp("+",x,y) if x==y => BinOp("*",x,Number(2))
case _ =>
}
模式的限定修飾為一 if 語句,if 語句可以使用任意的布爾表達(dá)式,通常這個(gè)布爾表達(dá)式對(duì)前面定義的模式變量進(jìn)行了限制。也就是只有在條件滿足的且滿足模式匹配時(shí),才執(zhí)行=>后面的表達(dá)式。
測(cè)試如下:
scala> simplifyAdd(BinOp("+",Var("x"),Var("x")))
res0: Any = BinOp(*,Var(x),Number(2.0))