谈谈Scala的抽取器(Extractor)

  • 时间:
  • 浏览:0

当然使用unapply才能不可不能能 ,假若写法上没办法 没办法 直观. 着实Scala的Array, List等集合类实现了unapplySeq土办法 ,使得亲们 儿能不可不能能 没办法 写:

当然你完整篇 能不可不能能 用正则表达式实现,但我相信那样做要比较复杂得多,但会 不够灵活性。

假若你才能 匹配或分解selector的多个组成主次, 而以前又不确定 有多少,我能 使用unapplySeq土办法 。unapplySeq的用法跟unapply差过多,但才能 返回Option[Seq[T]]类型。 比如我才能 把ggd543@gdut.edu.cn的邮件域名各组成主次提取出来, cn, edu, gdut。 下面的例子匹配邮件用户名前缀为stu_ ,域名为cn的邮件地址:

着实看起来一阵一阵像Constructor Pattern.

由于你对extractor的理解仅仅在等待在能实现用户自定义的模式匹配的技术层面上,那就太肤浅了。 我认为Scala提供抽取器(Extractor) 某些语法糖的目的在于,将数据模型和视图逻辑分离,由于说它充当了类似适配器那样的角色, 但会 是某些比较函数式的做法。

所谓的extractor假若指包含unapply土办法 (或unapplySeq土办法 )的对象. 由于你只想检验该字符串算不算为有俩个合法的邮件地址, 能不可不能能 让unapply返回Boolean类型. 假若你希望过滤出邮件用户名不包含大写字母, 且是由重复的两主次组成的,比如coco@hotmail.com,我能 另有俩个做:

实际上str 与 Email 作模式匹配时 会被翻译成

初次接触*抽取器(Extractor)某些概念,一阵一阵不好理解,由于是自己英语不过关。经过反复推敲,总算弄明白是哪此一回事.

至于在实际编程中应该采用case class还是extractor进行模式匹配,官方给出的建议是:

还是从有俩个例子说起。 假设亲们 儿想验证有俩个字符串的格式算不算符合邮件地址格式,由于是,提取它的用户主次和域名主次。比如给定字符串jack@163.com , 经过测试发现符合邮件地址格式,但会 提取出jack163.com。一般做法是通过正则表达式进行匹配并提取相应的匹配组. 在Scala中,能不可不能能 通过模式匹配实现。具体做法是,给有俩个对象(不妨叫obj)定义有俩个unapply土办法 ,且该土办法 才能 返回Option[T]类型; 在使用该对象与给定的参数(不妨叫selector)进行模式匹配时,会调用该对象的unapply土办法 ; 调用unapply土办法 才能 传入有俩个参数,该参数假若待匹配的参数(selector);匹配逻辑定义在unapply土办法 中,假若匹配成功,unapply土办法 返回Some[T]类型的对象, 但会 返回None。Some()中包含的内容没办法 限制,但一般让它带回匹配的内容。 比如

以下的讨论基于scala 2.8