Scala 自学笔记 操作符

反引号

val `val` = 42 // 合法的
这个示例很糟糕,但反引号有时可以派上用场,
比如在Scala中yield 是一个保留字,
但可能需要访问Java中一个同样命名的方法时,可以
Thread.`yield`()

中置操作符

a 标识符 b (一个隐式参数和一个显式参数)
1 to 10
1.to(10)
1 -> 10
1.->(10)

自定义操作符: 计算两个分数的乘积
(n1/d1) * (n2/d2) = (n1n2 / d1d2)
class Fraction(n : Int, d : Int){
  private int num = ...
  private int den = ...
  def *(other: Fraction) = new Fraction(num * other num, den * other.den)
}


一元操作符

a 标识符
后置操作符
1 toString
1.toString()

前置操作符,它们被转换成名为unary_操作符 的方法调用
+、-、!、~
-a
即 a.unary_- 

apply 和 update方法

val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100 // scores.update("Bob",10) , f(arrg1,arg2,..) = 出现在等号左侧,即调update, 否则即apply
val bobsScore = scores("Bob") // scores.apply("Bob")

提取器
unapply ,是 apply 方法的反向操作
var Fraction(a, b) = Fraction(3,4) * Fraction(2,5)
object Fraction{
  def unapply(input : Fraction) = if (input.dem ==0) None else Some((input.num, input.den))
}
通常而言,模式匹配可能失败,unapply方法返回一个Option,包含一个元组,每个匹配到的变量各有一个值与之对应
该方法在分母为0时返回None,表示无匹配。

object Name {
 def unapply(input: String)={
  val pos = input.indexOf(" ")
  if(pos == -1) None
  else Some((input.substring(0,pos), input.substring(pos + 1)))
 }
}
val author = "Cay Horsmann"
val Name(first, last) = author //使用Name的unapply

每一个样例类都自动具备apply方法和unapply方法:
case class Currency(value :Double, unit : String)
Currency(29.5,"EUR") // 调用Currency.apply
case Currency(amount, "USD") => prinlnt("$"+ amount) // 调用Currency.unapply,这里的case是模式匹配

带单个参数或无参数的提取器

object Number{
  def unapply(input: String): Option[Int] = 
  try{
    Some(Interger.parseInt(input.trim))
  }catch{
    case ex : NumberFormatException => None
  }

}
val Number(n) = "1729" // 用来提取数字
提取器也可以只测试其输入而不是取值,unapply方法返回Boolean即可
object IsCompound{
  def unapply(input: String) = input.contains(" ")
}
author match{
  case Name(first, last @ IsCompound()) =>... //如果是 Peter van der,则能匹配到,因为last为 ”van der“,含有空格
  case Name(first, last) =>...
}


unapplySeq方法

提取任意长度的值得序列,用unapplySeq,它返回一个Option[Seq[A]],其中A是被提取的值得类型。
object Name{
  def unapplySeq(input : String): Option[Seq[String]] = 
  if(input.trim == "") None else Some(input.trim.split("\\s+") 
}
这样一来,就能匹配并取到任意数量的变量了:
author match{
  case Name(first, last) => ...
  case Name(first, middle, last) => ...
  case Name(first, "van", "der", last) => ...
}












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值