为什么在scala中只匹配类型的情况下我们需要单独的case标识符?

4xrmg8kj  于 2023-03-12  发布在  Scala
关注(0)|答案(1)|浏览(162)

documentation开始。
您可以按如下方式匹配类型:

sealed trait Device
case class Phone(model: String) extends Device:
  def screenOff = "Turning screen off"

case class Computer(model: String) extends Device:
  def screenSaverOn = "Turning screen saver on..."

def goIdle(device: Device): String = device match
  case p: Phone => p.screenOff
  case c: Computer => c.screenSaverOn

使用类型的第一个字母作为大小写标识符是一种约定(本例中为p和c)。
问题:
为什么我们需要单独的标识符pc?为什么我们不能像在普通模式匹配的情况下那样使用device.screenOffdevice.screenSaverOn来实现相同的效果?

ev7lccsx

ev7lccsx1#

两个选项都有效:

  • 类型化模式
def goIdle(device: Device): String = device match
  case p: Phone    => p.screenOff
  case c: Computer => c.screenSaverOn
  • 构造器模式/模式绑定器
def goIdle(device: Device): String = device match
  case p@Phone(_)    => p.screenOff
  case c@Computer(_) => c.screenSaverOn

假设PhoneComputer有很多参数,使用第二种方法,您将编写类似Phone(_,_,_,....,_)Computer(_,_,_,....,_)的模式。
如果device的类型只有Device(而不是它的子类型PhoneComputer),那么device.screenOffdevice.screenSaverOn不会编译。

相关问题