Scala 自学笔记 操作符
2015-02-16 15:44
155 查看
反引号
中置操作符
一元操作符
apply 和 update方法
提取器
带单个参数或无参数的提取器
unapplySeq方法
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) => ... }
相关文章推荐
- Scala 自学笔记2_类
- scala 自学笔记 高阶函数
- Scala学习笔记(六) - 操作符与字面量
- Scala自学代码笔记
- Scala 自学笔记 集合
- scala学习笔记——操作符
- scala快速学习笔记(一):变量函数,操作符,基本类型
- 快学Scala学习笔记及习题解答(10-11特质与操作符)
- Scala 自学笔记3_特质
- Scala学习笔记(六) - 操作符与字面量
- scala自学笔记(1)
- Scala 自学笔记 注解
- scala自学笔记(2)
- Scala 自学笔记
- Scala 自学笔记 模式匹配和样例类
- scala学习笔记-操作符
- Scala自学笔记
- scala学习笔记12 操作符
- SAP BC404 课程中文自学笔记
- SAP BC402 课程中文自学笔记