Scala入门到精通——第二十五节 提取器(Extractor)

本文详细介绍了Scala中的提取器(Extractor)及其应用,包括apply与unapply方法、零变量和单变量绑定的模式匹配、提取器与序列模式,以及Scala中的占位符使用总结。通过案例探讨了如何在不使用case class的情况下实现自定义的模式匹配功能,并解释了在模式匹配过程中apply和unapply方法的作用。同时,文章还讨论了在序列模式中unapplySeq的使用以及占位符_的多种用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:摇摆少年梦
视频地址:http://www.xuetuwuyou.com/course/12

本节主要内容

  1. apply与unapply方法
  2. 零变量或变量的模式匹配
  3. 提取器与序列模式
  4. scala中的占位符使用总结

1. apply与unapply方法

apply方法我们已经非常熟悉了,它帮助我们无需new操作就可以创建对象,而unapply方法则用于析构出对象,在模式匹配中特别提到,如果一个类要能够应用于模式匹配当中,必须将类声明为case class,因为一旦被定义为case class,scala会自动帮我们生成相应的方法,这些方法中就包括apply方法及unapply方法。本节将从提取器(也称析构器)的角度对unapply方法进行介绍。先看下面的这个例子(来源于programmin in scala)

object EMail{
   
   
  //apply方法用于无new构造对象
  def apply(user: String, domain: String) = user + "@" + domain
  //unapply方法用于在模式匹配中充当extractor
  def unapply(str: String): Option[(String, String)] = {
    val parts = str split "@"
    if (parts.length == 2) Some(parts(0), parts(1)) else None
  }
}
object ApplyAndUnapply {
   
   
  val email=EMail("zhouzhihubeyond","sina.com")

    //下面的匹配会导致调用EMail.unapply(email)
    case EMail(user,domain) => println("user="+user+" domain="+domain)
  }
}

在上述的代码中,我们将unapply方法定义为:
def unapply(str: String): Option[(String, String)] = {
val parts = str split "@"
if (parts.length == 2) Some(parts(0), parts(1)) else None
}

这是有道理的,原因在于可能会有不合法的email用于模式匹配,例如:

object ApplyAndUnapply extends App{
   
   
  def patternMatching(x:String)=x match {
    //下面的匹配会导致调用EMail.unapply(email)
    case EMail(user,domain) => println("user="+user+" domain="+domain)
    //匹配非法邮箱
    case _ => println("non illegal email")
  }
  val email=EMail("zhouzhihubeyond","sina.com")
  patternMatching(email) 
  patternMatc
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值