Scala对象系统
Scala对象系统总体上,Scala
对象系统可分为两类:
- 引用类型
- 值类型
引用类型
-
AnyRef
的子类 - 使用
new
构造对象 - 当存在默认构造函数,可以略去括号
-
AnyRef
等价于java.lang.Object
- 可以将
null
赋值给Reference Type
值类型
-
AnyVal
的子类 Char, Byte, Short, Int, Long, Float, Double, Unit, Boolean
- 不能使用
new
构造实例,而使用Literal Values
构造实例 - 编译器将其映射为
Java
原生类型,以便提升性能 - 不能将
null
赋值给Int
的变量
以Int
为例,Int
的定义应该类似于:
final abstract class Int private extends AnyVal
-
final
表示不能被子类化 -
abstract
表示不能被实例化 -
private
表示主构造函数私有化,进一步保证不能被实例化 -
extends AnyVal
表示只能使用字面值构造实例
数值
归功于Scala
良好的可扩展性,数值文字可以表现得像普通对象一样。
1 to 10
事实上,Int
并不存在to
方法,Predef
定义了一个Int
到RichInt
的隐式转换,从而提供更丰富的操作数值的方法。
object Predef {
implicit def intWrapper(x: Int) = new runtime.RichInt(x)
}
package scala.runtime
class RichInt(val self: Int) extends AnyVal {
......
def to(end: Int): Range.Inclusive = Range.inclusive(self, end)
}
字符串
"+9519760513".exists(_.isDigit)
java.lang.String
并不存在exists
方法,Predef
定义了一个隐式转换,使String
可以隐式地转换为StringOps
,从而提供更丰富的操作字符串的方法。
object Predef {
implicit def augmentString(x: String): StringOps = new StringOps(x)
}
Unit
值
Unit
类型在JVM
中对应于Java
的void
。
final abstract class Unit private extends AnyVal
()
是其唯一的实例。
classOf[Unit] // Class[Unit] = void
().getClass // Class[Unit] = void
classTag[Unit] // scala.reflect.ClassTag[Unit] = Unit
classTag[Unit].runtimeClass // Class[_] = void
Null
值
Null
是所有AnyRef
的子类型,存在唯一的实例null
。不能将null
赋予Value Types
。
val num: Int = null // Error
符号
'1th
'2th
如果符号中有空格,可以是使用Symbol::apply
直接构造
Symbol("Programming Scala")
元组
(1, "two")
等价于Tuple2(1, "twp")
,或者Tuple2[Int, String](1, "two")
。
val t1 = (1, "two")
val t1: (Int,String) = (1, "two")
val t2: Tuple2[Int,String] = (1, "two")
函数值
(i: Int, s: String) => s+i
是类型为Function2[Int, String, String]
的一个字面值。
字面值的类型定义常常用于类型声明:
val f1: (Int, String) => String = (i, s) => s + i
val f2 = (i: Int, s: String) => s + i
val f3: Function2[Int, String, String] = (i, s) => s+ i
自定义
归功于Scala
良好的可扩展性,Scala
可方便地实现文字的自定义。
Map元组
val capital = Map("US" -> "Washington", "France" -> "Paris")
"US" -> "Washington"
构造了一个类型为Tuple2[String, String]
的二元组:("US", "Washington")
。
package scala
object Predef {
implicit final class ArrowAssoc[A](self: A) extends AnyVal {
def ->[B](y: B) = (self, y)
}
}
正则表达式
val regex = "([0-9]+) ([a-z]+)".r
字符串内插
println(s"$name is $age years old.")
s
其本质仅仅是一个函数而已。
package scala
case class StringContext {
def s(args: Any*): String = ???
}
网友评论