您的位置:首页 > 其它

Scala 自学笔记 操作符

2015-02-16 15:44 155 查看
反引号

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) => ...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: