您的位置:首页 > 其它

Scala学习笔记

2016-07-08 21:31 239 查看

标识符

在定义标识符的时候,可以像java经典模式那样定义。当然,scala在选择标识符的时候有比java更多的选择,可以使用Unicode字符和以字母和下划线开头,你也可以使用任意序列的操作符字符。此外,我们还可以定义符号标识符,例如:

val √ = scala.math.sqrt _


还有一个对于保留字符的定义的解决办法,我们可以利用反引号来实现对于关键字的定义方法。

val `val` = 42


这种方法可以标新立异,但是用起来易混淆,这样程序不宜读。

中置操作符

a 标识符 b

其中标识符代表一个带有两个参数的方法(一个隐式的参数和一个显示的参数)。

例如:

1 to 10 等价于 1.to(10)

一元操作符

只有一个参数,比如:1 toString() 等价于 1.toString()

如下四个操作符+、-、!、~可以作为前置(prefix)操作符,出现在参数之前。它们被转换成对名为unary_操作符的方法调用。例如:

-a 等价于 a.unary_-一样。

赋值操作符

a 操作符= b

等同于:

a = a 操作符 b

需要注意:

<=、>=和!= 不是赋值操作符

以=开头的操作符不是赋值操作符

如果a有一个名为操作符=的方法,那么该方法会被直接调用。

结合性

在scala中,所有操作符都是左结合的,除了:

- 以冒号(:)结尾的操作符

- 赋值操作符。

在scala中有一个很有用的操作符::,它是右结合的,用来构造列表。例如:

1::2::Nil


等价于

1::(2::Nil)


比如:



apply和update

apply方法经常用在伴生类对象中,用来构造对象而不是使用new显示地使用new,比如:

class RichFile(val path : String) {
}
object RichFile{
def apply(path : String) : RichFile = {
new RichFile(path)
}
}


在object中定义了apply方法,返回一个对象。

提取器

所谓提取器就是一个带有unapply方法的对象。它的返回值是一个Option,它包含一个元组,每个匹配到的变量各有一个值与之对应。

还可以用它来进行模式匹配。

比如:

object RichFile{
def apply(path : String) : RichFile = {
new RichFile(path)
}

def unapply(richFile: RichFile) = {
if(richFile.path == null){
None
}else{
val reg = "([/\\w+]+)/(\\w+)\\.(\\w+)".r//转换为正则表达式
val reg(r1,r2,r3) = richFile.path//这块相当于模式匹配
Some(r1,r2,r3)
}
}
def main (args: Array[String] ) {
val richFile = RichFile("/home/cay/readme.txt")
val RichFile(r1,r2,r3) = richFile
println(r1)
println(r2)
println(r3)
}
}


unapplySeq方法

主要用来提取任意长度值的序列,我们应该用unapplySeq来命名我们的方法。返回值为Option[Seq[A]],其中A是被提取值的类型。

比如:

object RichFile2 {
def apply(path: String): RichFile2 = new RichFile2(path)

def unapplySeq(richFile2: RichFile2): Option[Seq[String]] =
if(richFile2.path == null) None
else{
Some(richFile2.path.split("/"))
}

def main(args: Array[String]) {
val richFile = RichFile2("/home/cay/readme.txt")
val RichFile2(r @ _*) = richFile
println(r)
}
}


RichFile2提取出来组成路径的所有部分序列。



apply方法和unapply方法在scala中是比较重要的两个方法,提现了scala的一大特性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: