标准库
Scala Package
Any
1 | class Any{ |
1 | 1.asInstanceOf[String] // 报错,未定义隐式转换函数 |
Option
1 | class Option[T]{ |
推荐使用
Option
类型表示可选值,明示该值可能为None
Option
类型可以被迭代Some(s)
:唯一迭代s
None
:空
1
2val a = Some("hello")
a.foreach(x => println(x.length))
Predef
1 | object Predef extends LowPriorityImplicits{ |
List
collection
mutable
Map
1 | val a=Map((3,4), 5->6) |
immutable
reflect
runtime
universe
universe
:提供一套完整的反射操作,可以反思性的检查 类型关系,如:成员资格、子类型
1 | // 返回类型`T`“类型值”,可以用于比较 |
TypeTag
TypeTag
:提供编译时具体类型的信息- 能获取准确的类型信息,包括更高的泛型类型
- 但无法获取运行时值的类型信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14import scala.reflect.runtime.universe.{TypeTag, TypeRef, typeTag}
// 声明隐式参数列表
def recognize[T](x: T)(implicit tag: TypeTag[T]): String =
tag.tpe match {
case TypeRef(utype, usymbol, args) =>
List(utype, usymbol, args).mkString("\n")
}
val list: List[Int] = List(1,2)
val ret = recognize(list)
// 显式实例化`TypeTag`
val tag = typeTag[List[String]]WeakTypeTag
:提供编译时包括抽象类型的信息WeakTypeTag
可以视为TypeTag
的超集- 若有类型标签可用于抽象类型,
WeakTypeTag
将使用该标记
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import scala.reflect.runtime.universe.{WeakTypeTag, TypeRef, weakTypeRef}
// 声明隐式参数列表
def recognize[T](x: T)(implicit tag: WeakTypeTag[T]): String =
tag.tpe match {
case TypeRef(utype, usymbol, args) =>
List(utype, usymbol, args).mkString("\n")
}
abstract class SAClass[T]{
// 抽象类型
val list: List[T]
val result = Recognizer.recognize(list)
println(result)
}
new SAClass[Int] { val list = List(2,3)}
// 显式实例化`WeakTypeTag`
val tag = weakTypeTag[List[String]]
- 当需要
TypeTag[T]
、WeakTypeTag[T]
类型的隐式值tag
时, 编译器会自动创建,也可以显式实例化- 以上类型探测通过反射实现,编译器根据传递实参推断泛型 参数
T
,由此确定特定类型标签隐式值
ClassTag
ClassTag
:提供关于值的运行时信息
- 不能在更高层次上区分,如:无法区分
List[Int]
、List[String]
- 是经典的老式类,为每个类型捆绑了单独实现,是标准的 类型模式
1 | import scala.reflect.{ClassTag, classTag} |
当需要
ClassTag[T]
类型的隐式值ct
时,编译器会自动创建- 也可以使用
classTag
显式实例化
- 也可以使用
ClassTag[T]
类型值ct
存在时,编译器将自动- 包装
(_:T)
类型模式为ct(_:T)
- 将模式匹配中未经检查的类型测试模式转换为已检查类型
- 包装
util
matching
Regex
1 | import scala.util.matching.{Regex, Match} |
1 | val keyValPattern: Regex = "([0-9a-zA-Z-#() ]+): ([0-9a-zA-Z-#() ]+)".r |