无match关键字的Scala模式匹配:匹配对象及语法疑问咨询
关于Scala中Policy.adjust方法的两个疑问解答
首先先把你提到的这段Scala代码贴出来方便参考:
object Policy { def adjust[P <: Policy](p: P, d: Discount): P = { case ap: AutoPolicy => new AutoPolicy case lp: LifePolicy => new LifePolicy // ... etc } }
咱们逐个解决你的两个疑问:
一、模式匹配具体作用于哪个值?
这个模式匹配的目标就是方法的第一个参数p。你可以把这段代码理解成是下面写法的简化:
def adjust[P <: Policy](p: P, d: Discount): P = p match { case ap: AutoPolicy => new AutoPolicy case lp: LifePolicy => new LifePolicy // ... etc }
本质上就是对传入的p(也就是具体的Policy子类实例)做类型匹配,根据它的实际类型返回对应的新实例。
二、代码为何省略了match关键字?
这是Scala提供的语法糖,当方法的整个方法体就是一个针对单个参数的模式匹配时,你可以省略match关键字,直接写case语句块。这种写法其实是把方法体定义成了一个偏函数(PartialFunction),Scala会自动把它和参数p绑定起来,等价于显式写p match { ... }的形式。
不过要注意,这种写法只有当匹配的目标是方法的参数,且整个方法体就是模式匹配表达式的时候才能用,要是你在方法体里还有其他逻辑,就必须显式写出match关键字了。
内容的提问来源于stack exchange,提问作者sge
相关产品推荐
相关产品推荐

