Scala Essentials: 字面值

類型系統

引用類型

  • AnyRef的子類java

  • 使用new構造對象api

  • 當存在默認構造函數,能夠略去括號app

  • AnyRef等價於java.lang.Object函數

  • 能夠將null賦值給Reference Type性能

值類型

  • AnyVal的子類spa

  • Char, Byte, Short, Int, Long, Float, Double, Unit, Booleanscala

  • 不能使用new構造實例,而使用Literal Values構造實例code

  • 編譯器將其映射爲Java原生類型,以便提高性能對象

  • 不能將null賦值給Int的變量ci

Int爲例,其定義相似於:

final abstract class Int private extends AnyVal
  • final表示不能被子類化

  • abstract表示不能被實例化

  • private表示主構造函數私有化,進一步保證不能被實例化

  • extends AnyVal表示只能使用字面值構造實例

內置字面值

Unit()

Unit類型在JVM中對應於Javavoid

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

具備返回值類型爲Unit的函數經常被稱爲「過程」(Procedure)。

def update(i: Int, value: Char): Unit = {
  ...
}

經常忽略Unit =Scala默認推演爲Unit。上例等價於

def update(i: Int, value: Char) {
  ...
}

返回值爲Unit的函數,表明了「反作用」語義;從某種意義上講,「過程」是一種反函數式的思惟。

Nullnull

Null是全部AnyRef的子類型,存在惟一的實例null。不能將null賦予「值類型」,例如Int, Boolean等。

val num: Int = null  // Compile 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

自定義自面值

Map

val capital = Map("US" -> "Washington", "France" -> "Paris")

"US" -> "Washington"構造了一個類型爲Tuple2[String, String]的二元組:("US", "Washington")

package scala

object Predef {
  implicit final class ArrowAssoc[A](private val self: A) extends AnyVal {
    def ->[B](y: B) = (self, y)
  }
}

Regex

val regex = "([0-9]+) ([a-z]+)".r

須要注意的是,r並不是java.lang.String的方法,Scala擁有一套完備的機制加強既有類庫的能力。

相關文章
相關標籤/搜索