Scala学习笔记

前言

之前看Scala编程思想学习Scala,只看完了一半多,就没再继续深入学习,导致一些Scala基础知识还不知道,而且过去这么长时间了,之前学过的也遗忘了,所以这里主要记录自己学习Scala时容易遗忘的一些点,以备自己随时查看,增加记忆。这个主要给自己用,不定时更新添加~

1、在线文档

2、一些点

setter

setter方法是在getter方法的后面加上_=,后面跟着参数

构造方法的参数

主构造方法中带有val和var的参数时公有的。然而由于val是不可变的,所以不能像下面这样去使用。

class Point(val x: Int, val y: Int)
val point = new Point(1, 2)
point.x = 3  // <-- does not compile

不带val或var的参数是私有的,仅在类中可见。

class Point(x: Int, y: Int)
val point = new Point(1, 2)
point.x  // <-- does not compile

特质

之前只知道trait,Scala的接口用trait,而不知道Scala特质,其实特质就是trait…

特质 (Traits) 用于在类 (Class)之间共享程序接口 (Interface)和字段 (Fields)。 它们类似于Java 8的接口。 类和对象 (Objects)可以扩展特质,但是特质不能被实例化,因此特质没有参数。

  • 使用特质:使用 extends 关键字来扩展特质。然后使用 override 关键字来实现trait里面的任何抽象成员 trait Iterator[A] { def hasNext: Boolean def next(): A } class IntIterator(to: Int) extends Iterator[Int] { private var current = 0 override def hasNext: Boolean = current < to override def next(): Int = { if (hasNext) { val t = current current += 1 t } else 0 } } val iterator = new IntIterator(10) iterator.next() // returns 0 iterator.next() // returns 1
  • 实现多个Traits用with关键字 extends Trait1 with Trait2 with Trait3

隐式参数

方法可以具有 隐式 参数列表,由参数列表开头的 implicit 关键字标记。 如果参数列表中的参数没有像往常一样传递, Scala 将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递。

简单的程序示例:

def fun(a:Int)(implicit b:Int = 0) = {
	println(a,b)
}

fun(1) 结果:(1,0)

添加隐式值:

implicit val implicitInt:Int = 10

结果变为:(1,10)

参数b为隐式参数,调用fun时不能传参数b,首先会找隐式定义类型为Int的值,如果找到(implicitInt),则传隐式值(implicitInt),找不到传默认值,没有默认值且没有隐式值,会报错:

◾could not find implicit value for parameter b: Int
◾not enough arguments for method fun: (implicit b: Int)Unit. Unspecified value parameter b.

不能有多个相同类型的隐式值,否则,调用fun函数时,会报冲突的异常:

◾ambiguous implicit values: both value implicitInt in object ImplicitTest of type ⇒ Int and value implicitInt2 in object ImplicitTest of type ⇒ Int match expected type Int...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券