首页 > 其他分享 >无涯教程-Scala - 提取器

无涯教程-Scala - 提取器

时间:2024-01-26 18:31:38浏览次数:32  
标签:unapply 教程 Scala Demo 无涯 com apply Learnfk gmail

Scala中的提取器Extractors是一个对象 ,该对象具有称为 unapply 的方法,该方法的目的是匹配值并将其拆开。

让我们以对象定义 apply 和 unapply 方法为示例, apply方法的含义与以往相同:它将Test变成一个对象 ,该对象可以以与应用方法相同的方式应用于括号中的参数。因此,您可以编写Test(" Learnfk"," gmail.com")来构造字符串" [email protected]"。

unapply 方法将Test类转换为 extractor ,并颠倒了 apply 的构造过程,其中apply接受两个字符串并组成一个电子邮件地址字符串,unapply接受一个电子邮件地址并返回可能的两个字符串:该地址的 user 和 domain 。

Extractors - 语法

unapply("[email protected]") equals Some("Learnfk", "gmail.com")
unapply("Learnfk Ali") equals None

以下示例程序显示了电子邮件地址的提取器对象 。

Extractors - 示例

object Demo {
   def main(args: Array[String]) {
      println ("Apply method : " + apply("Learnfk", "gmail.com"));
      println ("Unapply method : " + unapply("[email protected]"));
      println ("Unapply method : " + unapply("Learnfk Ali"));
   }
   
   //注入方式(可选)
   def apply(user: String, domain: String)={
      user +"@"+ domain
   }

   //提取方法(必填)
   def unapply(str: String): Option[(String, String)]={
      val parts=str split "@"
      
      if (parts.length == 2){
         Some(parts(0), parts(1)) 
      } else {
         None
      }
   }
}

将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。

\>scalac Demo.scala
\>scala Demo
Apply method : [email protected]
Unapply method : Some((Learnfk,gmail.com))
Unapply method : None

模式匹配

当类的后跟带有零个或多个参数的列表的括号时,编译器将对该调用 apply 方法,我们可以在对象和类中定义应用。

如上所述,它执行与 apply 应用相反的操作。使用 match 语句比较提取器对象时,将自动执行 unapply 方法。

模式匹配 - 示例

object Demo {
   def main(args: Array[String]) {
      val x=Demo(5)
      println(x)

      x match {
         case Demo(num) => println(x+" is bigger two times than "+num)
         
         //unapply is invoked
         case _ => println("i cannot calculate")
      }
   }
   def apply(x: Int)=x*2
   def unapply(z: Int): Option[Int]=if (z%2==0) Some(z/2) else None
}

将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。

\>scalac Demo.scala
\>scala Demo
10
10 is bigger two times than 5

参考链接

https://www.learnfk.com/scala/scala-extractors.html

标签:unapply,教程,Scala,Demo,无涯,com,apply,Learnfk,gmail
From: https://blog.51cto.com/u_14033984/9437349

相关文章

  • 无涯教程-Scala - 异常处理
    Scala的异常与Java之类的许多其他语言中的异常一样工作,方法可以通过引发异常来终止,但是,Scala实际上没有检查过的异常。当您要处理异常时,可以像在Java中一样使用try{...}catch{...}块,只是catch块使用匹配来识别和处理异常。抛出异常引发异常看起来与Java中相同,创建一个异常......
  • 幻兽帕鲁服务器一键搭建教程
    最近缝合怪游戏《幻兽帕鲁(Palworld)》Steam在线峰值破百万,成为Steam史上同时在线玩家数最多的付费游戏。服务器于1月21日再次出现宕机情况,很多玩家选择自建游戏服务器。幻兽帕鲁是Pocketpair开发的一款开放世界生存制作游戏,游戏于2024年1月18日发行抢先体验版本。游戏中,玩家......
  • 无涯教程-Scala - 正则表达式
    本章介绍Scala如何通过scala.util.matching包中提供的Regex类支持正则表达式。尝试下面的示例程序,我们将尝试从语句中找出单词Scala。importscala.util.matching.RegexobjectDemo{defmain(args:Array[String]){valpattern="Scala".rvalstr="Sc......
  • Adobe Photoshop 2023激活教程(亲测有效)
    Photoshop软件具有直观易用的用户界面,各种图像编辑和处理工具,各种图层和蒙版功能,各种滤镜和插件。是一个非常强大的数字图像处理和编辑软件。无论是初学者还是有经验的设计师都可以使用该软件轻松地处理、修改和创建各种类型的图像,以满足不同领域的需求。安装步骤:https://kdocs.c......
  • 幻兽帕鲁有多火?!腾讯云联机服务器卖爆啦!4核16G官方推荐,限时特惠(内含教程)
    腾讯云4核16G仅需66元/月,适合用来搭建幻兽帕鲁服务器,支持32人专用服务器要自建幻兽帕鲁(Palworld)的服务器,可以采取以下步骤:获取服务器软件:首先,您需要在Steam库中搜索"PalworldDedicatedServer",或者在"工具"选项中选择进行搜索以找到该软件。下载并安装服务器软件:找到并下载所......
  • 无涯教程-Scala - 模式匹配
    在函数值和闭包之后,模式匹配是Scala第二广泛使用的函数,Scala在处理消息时为模式匹配提供了强大的支持。Pattern-示例objectDemo{defmain(args:Array[String]){println(matchTest(3))}defmatchTest(x:Int):String=xmatch{case1=>......
  • Vue2.0新手教程:如何轻松实现数字输入框指令?
    前言前端项目中,输入框是常见的,数字输入框更是常见,我们也许用惯了UI框架或是第三方提供的数字输入框,其实我们内心也想拥有自己的一个数字输入框指令,进可以攻(灵活使用),退可以守(灵活扩展),一切尽在掌握之中,不尽于被动。需求最近用到了数字输入框,需求需要满足:设置输入的小数位数设置是......
  • 无涯教程-Scala - 特性(Traits)
    Traits封装了方法和字段定义,然后可以通过混合到类中来重用它们。与类继承不同,一个类可以混合任意数量的traits。traits定义看起来类似于类定义,只是它使用关键字trait。以下是trait的基本示例语法。Traits-语法traitEqual{defisEqual(x:Any):BooleandefisNot......
  • 无涯教程-Scala - 数组(Arrays)
    Scala提供了一种数据结构数组,它存储了相同类型元素的固定大小的顺序集合。声明数组要在程序中使用数组,必须声明一个变量以引用该数组,并且必须指定该变量可以引用的数组的类型。varz:Array[String]=newArray[String](3)orvarz=newArray[String](3)在此,z被声明为可容......
  • 无涯教程-Scala - 闭包
    closure闭包是一个函数,其返回值取决于在此函数外部声明的一个或多个变量的值。以下带有匿名函数的代码。valmultiplier=(i:Int)=>i*10这里,函数体中使用的唯一变量i*10是i,它被定义为函数的参数,尝试以下代码-valmultiplier=(i:Int)=>i*factor乘数中有两个自由变......